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

neicole 2014-04-02 09:25:26
需求:
假设现在有一段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),所以还没能往下试。请问这思路是否可行,是否有其它更佳思路?
...全文
583 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
neicole 2014-04-04
  • 打赏
  • 举报
回复
引用 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帧,则不可行。[/quote] 谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?[/quote] 是的,但是不需要完全重新编码,只需要编码衔接段那几帧,譬如找到30s的之前的I帧到30s这几帧,还有后面那些帧。[/quote] 噢,我想我明白意思了~  只是这样子我就产生了进一步的疑惑了,在GStreamer里面,要做到编码衔接的话,貌似是不行。 因为按我理解的话,貌似每个组件产生的src都是一个整体了,无法在中途做一些其它的操作,然后再继续进行组件内部操作。[/quote] 利用现成的组件肯定是不行了,如果执意要用GST,只能自己写组件了。 用ffmpeg,我想会来的更简单一些,但是也需要编码。[/quote] 噢~ 话说,我在上网查资料的时候,找到关于一个叫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)这就能成功了,很是困惑。[/quote] 具体实现就要你去试验了,[/quote] 哈哈,好吧,谢啦~
__cc__ 2014-04-04
  • 打赏
  • 举报
回复
引用 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帧,则不可行。[/quote] 谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?[/quote] 是的,但是不需要完全重新编码,只需要编码衔接段那几帧,譬如找到30s的之前的I帧到30s这几帧,还有后面那些帧。[/quote] 噢,我想我明白意思了~  只是这样子我就产生了进一步的疑惑了,在GStreamer里面,要做到编码衔接的话,貌似是不行。 因为按我理解的话,貌似每个组件产生的src都是一个整体了,无法在中途做一些其它的操作,然后再继续进行组件内部操作。[/quote] 利用现成的组件肯定是不行了,如果执意要用GST,只能自己写组件了。 用ffmpeg,我想会来的更简单一些,但是也需要编码。[/quote] 噢~ 话说,我在上网查资料的时候,找到关于一个叫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)这就能成功了,很是困惑。[/quote] 具体实现就要你去试验了,
neicole 2014-04-04
  • 打赏
  • 举报
回复
引用 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帧,则不可行。[/quote] 谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?[/quote] 是的,但是不需要完全重新编码,只需要编码衔接段那几帧,譬如找到30s的之前的I帧到30s这几帧,还有后面那些帧。[/quote] 噢,我想我明白意思了~  只是这样子我就产生了进一步的疑惑了,在GStreamer里面,要做到编码衔接的话,貌似是不行。 因为按我理解的话,貌似每个组件产生的src都是一个整体了,无法在中途做一些其它的操作,然后再继续进行组件内部操作。[/quote] 利用现成的组件肯定是不行了,如果执意要用GST,只能自己写组件了。 用ffmpeg,我想会来的更简单一些,但是也需要编码。[/quote] 噢~ 话说,我在上网查资料的时候,找到关于一个叫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)这就能成功了,很是困惑。
__cc__ 2014-04-04
  • 打赏
  • 举报
回复
引用 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帧,则不可行。[/quote] 谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?[/quote] 是的,但是不需要完全重新编码,只需要编码衔接段那几帧,譬如找到30s的之前的I帧到30s这几帧,还有后面那些帧。[/quote] 噢,我想我明白意思了~  只是这样子我就产生了进一步的疑惑了,在GStreamer里面,要做到编码衔接的话,貌似是不行。 因为按我理解的话,貌似每个组件产生的src都是一个整体了,无法在中途做一些其它的操作,然后再继续进行组件内部操作。[/quote] 利用现成的组件肯定是不行了,如果执意要用GST,只能自己写组件了。 用ffmpeg,我想会来的更简单一些,但是也需要编码。
neicole 2014-04-04
  • 打赏
  • 举报
回复
引用 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帧,则不可行。[/quote] 谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?[/quote] 是的,但是不需要完全重新编码,只需要编码衔接段那几帧,譬如找到30s的之前的I帧到30s这几帧,还有后面那些帧。[/quote] 噢,我想我明白意思了~  只是这样子我就产生了进一步的疑惑了,在GStreamer里面,要做到编码衔接的话,貌似是不行。 因为按我理解的话,貌似每个组件产生的src都是一个整体了,无法在中途做一些其它的操作,然后再继续进行组件内部操作。
__cc__ 2014-04-04
  • 打赏
  • 举报
回复
引用 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帧,则不可行。[/quote] 谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?[/quote] 是的,但是不需要完全重新编码,只需要编码衔接段那几帧,譬如找到30s的之前的I帧到30s这几帧,还有后面那些帧。
neicole 2014-04-04
  • 打赏
  • 举报
回复
引用 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帧,则不可行。[/quote] 谢谢~ 那意思是如果非纯I帧,不管用哪些思路,都必须得重编码?
__cc__ 2014-04-04
  • 打赏
  • 举报
回复
引用 楼主 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,541

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧