热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何用GStreamer删除H264格式的中间部分视频

本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。
需求:
假设现在有一段H264视频文件,视频长度为60s,现在需要将其中的30-39s的内容去掉,视频处理后总长为50s。

请问是否能够不通过重编码实现。(即不用上coder/encoder)

我的思路:
gst-launch-1.0 filesrc location=... ! qtdemux ! mp4mux ! filesink location=...

打算在编程时使用gst_element_seek(...)来将中间的秒数去掉,但不确定这方法是否可行,现在在编程过程中遇上了不知道如何解决的BUG (http://bbs.csdn.net/topics/390748487),所以还没能往下试。请问这思路是否可行,是否有其它更佳思路?

8 个解决方案

#1


引用 楼主 neicole 的回复:
需求:
假设现在有一段H264视频文件,视频长度为60s,现在需要将其中的30-39s的内容去掉,视频处理后总长为50s。

请问是否能够不通过重编码实现。(即不用上coder/encoder)

我的思路:
gst-launch-1.0 filesrc location=... ! qtdemux ! mp4mux ! filesink location=...

打算在编程时使用gst_element_seek(...)来将中间的秒数去掉,但不确定这方法是否可行,现在在编程过程中遇上了不知道如何解决的BUG (http://bbs.csdn.net/topics/390748487),所以还没能往下试。请问这思路是否可行,是否有其它更佳思路?

这个不一定可行,因为关键帧的位置问题,如果是纯I帧,理论上可行。但是如果存在B,P帧,则不可行。

#2


引用 1 楼 neustar1 的回复:
Quote: 引用 楼主 neicole 的回复:

需求:
假设现在有一段H264视频文件,视频长度为60s,现在需要将其中的30-39s的内容去掉,视频处理后总长为50s。

请问是否能够不通过重编码实现。(即不用上coder/encoder)

我的思路:
gst-launch-1.0 filesrc location=... ! qtdemux ! mp4mux ! filesink location=...

打算在编程时使用gst_element_seek(...)来将中间的秒数去掉,但不确定这方法是否可行,现在在编程过程中遇上了不知道如何解决的BUG (http://bbs.csdn.net/topics/390748487),所以还没能往下试。请问这思路是否可行,是否有其它更佳思路?

这个不一定可行,因为关键帧的位置问题,如果是纯I帧,理论上可行。但是如果存在B,P帧,则不可行。


谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?

#3


引用 2 楼 neicole 的回复:
Quote: 引用 1 楼 neustar1 的回复:

Quote: 引用 楼主 neicole 的回复:

需求:
假设现在有一段H264视频文件,视频长度为60s,现在需要将其中的30-39s的内容去掉,视频处理后总长为50s。

请问是否能够不通过重编码实现。(即不用上coder/encoder)

我的思路:
gst-launch-1.0 filesrc location=... ! qtdemux ! mp4mux ! filesink location=...

打算在编程时使用gst_element_seek(...)来将中间的秒数去掉,但不确定这方法是否可行,现在在编程过程中遇上了不知道如何解决的BUG (http://bbs.csdn.net/topics/390748487),所以还没能往下试。请问这思路是否可行,是否有其它更佳思路?

这个不一定可行,因为关键帧的位置问题,如果是纯I帧,理论上可行。但是如果存在B,P帧,则不可行。


谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?

是的,但是不需要完全重新编码,只需要编码衔接段那几帧,譬如找到30s的之前的I帧到30s这几帧,还有后面那些帧。

#4


引用 3 楼 neustar1 的回复:
Quote: 引用 2 楼 neicole 的回复:

Quote: 引用 1 楼 neustar1 的回复:

Quote: 引用 楼主 neicole 的回复:

需求:
假设现在有一段H264视频文件,视频长度为60s,现在需要将其中的30-39s的内容去掉,视频处理后总长为50s。

请问是否能够不通过重编码实现。(即不用上coder/encoder)

我的思路:
gst-launch-1.0 filesrc location=... ! qtdemux ! mp4mux ! filesink location=...

打算在编程时使用gst_element_seek(...)来将中间的秒数去掉,但不确定这方法是否可行,现在在编程过程中遇上了不知道如何解决的BUG (http://bbs.csdn.net/topics/390748487),所以还没能往下试。请问这思路是否可行,是否有其它更佳思路?

这个不一定可行,因为关键帧的位置问题,如果是纯I帧,理论上可行。但是如果存在B,P帧,则不可行。


谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?

是的,但是不需要完全重新编码,只需要编码衔接段那几帧,譬如找到30s的之前的I帧到30s这几帧,还有后面那些帧。


噢,我想我明白意思了~ 

只是这样子我就产生了进一步的疑惑了,在GStreamer里面,要做到编码衔接的话,貌似是不行。
因为按我理解的话,貌似每个组件产生的src都是一个整体了,无法在中途做一些其它的操作,然后再继续进行组件内部操作。

#5


引用 4 楼 neicole 的回复:
Quote: 引用 3 楼 neustar1 的回复:

Quote: 引用 2 楼 neicole 的回复:

Quote: 引用 1 楼 neustar1 的回复:

Quote: 引用 楼主 neicole 的回复:

需求:
假设现在有一段H264视频文件,视频长度为60s,现在需要将其中的30-39s的内容去掉,视频处理后总长为50s。

请问是否能够不通过重编码实现。(即不用上coder/encoder)

我的思路:
gst-launch-1.0 filesrc location=... ! qtdemux ! mp4mux ! filesink location=...

打算在编程时使用gst_element_seek(...)来将中间的秒数去掉,但不确定这方法是否可行,现在在编程过程中遇上了不知道如何解决的BUG (http://bbs.csdn.net/topics/390748487),所以还没能往下试。请问这思路是否可行,是否有其它更佳思路?

这个不一定可行,因为关键帧的位置问题,如果是纯I帧,理论上可行。但是如果存在B,P帧,则不可行。


谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?

是的,但是不需要完全重新编码,只需要编码衔接段那几帧,譬如找到30s的之前的I帧到30s这几帧,还有后面那些帧。


噢,我想我明白意思了~ 

只是这样子我就产生了进一步的疑惑了,在GStreamer里面,要做到编码衔接的话,貌似是不行。
因为按我理解的话,貌似每个组件产生的src都是一个整体了,无法在中途做一些其它的操作,然后再继续进行组件内部操作。

利用现成的组件肯定是不行了,如果执意要用GST,只能自己写组件了。
用ffmpeg,我想会来的更简单一些,但是也需要编码。

#6


引用 5 楼 neustar1 的回复:
Quote: 引用 4 楼 neicole 的回复:

Quote: 引用 3 楼 neustar1 的回复:

Quote: 引用 2 楼 neicole 的回复:

Quote: 引用 1 楼 neustar1 的回复:

Quote: 引用 楼主 neicole 的回复:

需求:
假设现在有一段H264视频文件,视频长度为60s,现在需要将其中的30-39s的内容去掉,视频处理后总长为50s。

请问是否能够不通过重编码实现。(即不用上coder/encoder)

我的思路:
gst-launch-1.0 filesrc location=... ! qtdemux ! mp4mux ! filesink location=...

打算在编程时使用gst_element_seek(...)来将中间的秒数去掉,但不确定这方法是否可行,现在在编程过程中遇上了不知道如何解决的BUG (http://bbs.csdn.net/topics/390748487),所以还没能往下试。请问这思路是否可行,是否有其它更佳思路?

这个不一定可行,因为关键帧的位置问题,如果是纯I帧,理论上可行。但是如果存在B,P帧,则不可行。


谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?

是的,但是不需要完全重新编码,只需要编码衔接段那几帧,譬如找到30s的之前的I帧到30s这几帧,还有后面那些帧。


噢,我想我明白意思了~ 

只是这样子我就产生了进一步的疑惑了,在GStreamer里面,要做到编码衔接的话,貌似是不行。
因为按我理解的话,貌似每个组件产生的src都是一个整体了,无法在中途做一些其它的操作,然后再继续进行组件内部操作。

利用现成的组件肯定是不行了,如果执意要用GST,只能自己写组件了。
用ffmpeg,我想会来的更简单一些,但是也需要编码。


噢~ 话说,我在上网查资料的时候,找到关于一个叫Segnment的组件:
A segment event is sent downstream to announce the range of valid timestamps in the stream and how they should be transformed into running-time and stream-time. A segment event must always be sent before the first buffer of data and after a flush (see above).
于是我就产生了这么一种思路,先将视频分割,然后,再将它们合起来,通过事件截取,在视频分割到指定位置后,再进行下一步的分割,然后再将它们输出到同一个文件当中。

即:假如: filesrc -> qtdemux -> mp4mux -> filesink, 那么,我在qtdemux那里截取流,写入seek事件(像范围播放的那个事件),本事件起的作用就是读取并且操作第一段的数据,然后,当知道这事件结束后,再进行下一段的数据设置。
gst_element_seek(qtdemux, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_SEGMENT, time_start1, time_end1);
但是不确定可不可行,如果会有问题,问题会出现在哪?

还不能上机尝试,因为我在做程序的时候遇到了一个问题,一直卡住,第三天了,一直在找资料还没解决,mp4mux接收了audio和video的sink后,设置pipeline的状态为GST_STATE_PLAYING,但不能成功,当我试着将它们一个个元素地尝试的时候,发现filesink一直都只能设置到READY状态。
但如果我只接收一个流(只要audio或者video)这就能成功了,很是困惑。

#7


引用 6 楼 neicole 的回复:
Quote: 引用 5 楼 neustar1 的回复:

Quote: 引用 4 楼 neicole 的回复:

Quote: 引用 3 楼 neustar1 的回复:

Quote: 引用 2 楼 neicole 的回复:

Quote: 引用 1 楼 neustar1 的回复:

Quote: 引用 楼主 neicole 的回复:

需求:
假设现在有一段H264视频文件,视频长度为60s,现在需要将其中的30-39s的内容去掉,视频处理后总长为50s。

请问是否能够不通过重编码实现。(即不用上coder/encoder)

我的思路:
gst-launch-1.0 filesrc location=... ! qtdemux ! mp4mux ! filesink location=...

打算在编程时使用gst_element_seek(...)来将中间的秒数去掉,但不确定这方法是否可行,现在在编程过程中遇上了不知道如何解决的BUG (http://bbs.csdn.net/topics/390748487),所以还没能往下试。请问这思路是否可行,是否有其它更佳思路?

这个不一定可行,因为关键帧的位置问题,如果是纯I帧,理论上可行。但是如果存在B,P帧,则不可行。


谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?

是的,但是不需要完全重新编码,只需要编码衔接段那几帧,譬如找到30s的之前的I帧到30s这几帧,还有后面那些帧。


噢,我想我明白意思了~ 

只是这样子我就产生了进一步的疑惑了,在GStreamer里面,要做到编码衔接的话,貌似是不行。
因为按我理解的话,貌似每个组件产生的src都是一个整体了,无法在中途做一些其它的操作,然后再继续进行组件内部操作。

利用现成的组件肯定是不行了,如果执意要用GST,只能自己写组件了。
用ffmpeg,我想会来的更简单一些,但是也需要编码。


噢~ 话说,我在上网查资料的时候,找到关于一个叫Segnment的组件:
A segment event is sent downstream to announce the range of valid timestamps in the stream and how they should be transformed into running-time and stream-time. A segment event must always be sent before the first buffer of data and after a flush (see above).
于是我就产生了这么一种思路,先将视频分割,然后,再将它们合起来,通过事件截取,在视频分割到指定位置后,再进行下一步的分割,然后再将它们输出到同一个文件当中。

即:假如: filesrc -> qtdemux -> mp4mux -> filesink, 那么,我在qtdemux那里截取流,写入seek事件(像范围播放的那个事件),本事件起的作用就是读取并且操作第一段的数据,然后,当知道这事件结束后,再进行下一段的数据设置。
gst_element_seek(qtdemux, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_SEGMENT, time_start1, time_end1);
但是不确定可不可行,如果会有问题,问题会出现在哪?

还不能上机尝试,因为我在做程序的时候遇到了一个问题,一直卡住,第三天了,一直在找资料还没解决,mp4mux接收了audio和video的sink后,设置pipeline的状态为GST_STATE_PLAYING,但不能成功,当我试着将它们一个个元素地尝试的时候,发现filesink一直都只能设置到READY状态。
但如果我只接收一个流(只要audio或者video)这就能成功了,很是困惑。

具体实现就要你去试验了,

#8


引用 7 楼 neustar1 的回复:
Quote: 引用 6 楼 neicole 的回复:

Quote: 引用 5 楼 neustar1 的回复:

Quote: 引用 4 楼 neicole 的回复:

Quote: 引用 3 楼 neustar1 的回复:

Quote: 引用 2 楼 neicole 的回复:

Quote: 引用 1 楼 neustar1 的回复:

Quote: 引用 楼主 neicole 的回复:

需求:
假设现在有一段H264视频文件,视频长度为60s,现在需要将其中的30-39s的内容去掉,视频处理后总长为50s。

请问是否能够不通过重编码实现。(即不用上coder/encoder)

我的思路:
gst-launch-1.0 filesrc location=... ! qtdemux ! mp4mux ! filesink location=...

打算在编程时使用gst_element_seek(...)来将中间的秒数去掉,但不确定这方法是否可行,现在在编程过程中遇上了不知道如何解决的BUG (http://bbs.csdn.net/topics/390748487),所以还没能往下试。请问这思路是否可行,是否有其它更佳思路?

这个不一定可行,因为关键帧的位置问题,如果是纯I帧,理论上可行。但是如果存在B,P帧,则不可行。


谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?

是的,但是不需要完全重新编码,只需要编码衔接段那几帧,譬如找到30s的之前的I帧到30s这几帧,还有后面那些帧。


噢,我想我明白意思了~ 

只是这样子我就产生了进一步的疑惑了,在GStreamer里面,要做到编码衔接的话,貌似是不行。
因为按我理解的话,貌似每个组件产生的src都是一个整体了,无法在中途做一些其它的操作,然后再继续进行组件内部操作。

利用现成的组件肯定是不行了,如果执意要用GST,只能自己写组件了。
用ffmpeg,我想会来的更简单一些,但是也需要编码。


噢~ 话说,我在上网查资料的时候,找到关于一个叫Segnment的组件:
A segment event is sent downstream to announce the range of valid timestamps in the stream and how they should be transformed into running-time and stream-time. A segment event must always be sent before the first buffer of data and after a flush (see above).
于是我就产生了这么一种思路,先将视频分割,然后,再将它们合起来,通过事件截取,在视频分割到指定位置后,再进行下一步的分割,然后再将它们输出到同一个文件当中。

即:假如: filesrc -> qtdemux -> mp4mux -> filesink, 那么,我在qtdemux那里截取流,写入seek事件(像范围播放的那个事件),本事件起的作用就是读取并且操作第一段的数据,然后,当知道这事件结束后,再进行下一段的数据设置。
gst_element_seek(qtdemux, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_SEGMENT, time_start1, time_end1);
但是不确定可不可行,如果会有问题,问题会出现在哪?

还不能上机尝试,因为我在做程序的时候遇到了一个问题,一直卡住,第三天了,一直在找资料还没解决,mp4mux接收了audio和video的sink后,设置pipeline的状态为GST_STATE_PLAYING,但不能成功,当我试着将它们一个个元素地尝试的时候,发现filesink一直都只能设置到READY状态。
但如果我只接收一个流(只要audio或者video)这就能成功了,很是困惑。

具体实现就要你去试验了,


哈哈,好吧,谢啦~

推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • TableAPI报一下异常:FieldtypesofqueryresultandregisteredTableSink
    报错信息如下:Exceptioninthread“main”org.apache.flink.table.api.ValidationException:Fieldtypesofq ... [详细]
  • kafka教程基本概念
    kafka教程基本概念 ... [详细]
  • 扩展名详解(转载)
    A对象代码库文件    AAMAuthorwareshocked文件    AASAuthorwareshocked包    ABF ... [详细]
  • 开发笔记:TSINGSEE青犀视频Webrtc实时通信的构建流程——PeerConnection对等通信的实现方式
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了TSINGSEE青犀视频Webrtc实时通信的构建流程——PeerConnection对等通信的实现方式相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了在Cpp中将字符串形式的数值转换为int或float等数值类型的方法,主要使用了strtol、strtod和strtoul函数。这些函数可以将以null结尾的字符串转换为long int、double或unsigned long类型的数值,且支持任意进制的字符串转换。相比之下,atoi函数只能转换十进制数值且没有错误返回。 ... [详细]
  • 本文介绍了关于Java异常的八大常见问题,包括异常管理的最佳做法、在try块中定义的变量不能用于catch或finally的原因以及为什么Double.parseDouble(null)和Integer.parseInt(null)会抛出不同的异常。同时指出这些问题是由于不同的开发人员开发所导致的,不值得过多思考。 ... [详细]
  • Summarize function is doing alignment without timezone ?
    Hi.Imtryingtogetsummarizefrom00:00otfirstdayofthismonthametric, ... [详细]
  • 参照www.Micro_Studios.com的视频,在Ubuntu中成功安装了opencv,并且测试成功。现把具体的安装及测试过程整理出来࿰ ... [详细]
  • http:www.atsc.orgcmsindex.phpstandardspublished-standards48-atsc-a52-standardTh ... [详细]
  • 在Android的多媒体类中,MediaMuxer和MediaCodec算是比较年轻的,它们是JB4.1和JB4.3才引入的。前者用于将音频和视频进行混合生成多媒体文件。缺点是目前 ... [详细]
  • owt默认支持桌面共享类型的localstream添加支持多个localstream的发布。videotrack的source看起来是owt封装实现的audiotrack的sour ... [详细]
author-avatar
mobiledu2502874455
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有