需求:
假设现在有一段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帧,不管用哪些思路,都必须得重编码?
需求:
假设现在有一段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这几帧,还有后面那些帧。
需求:
假设现在有一段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都是一个整体了,无法在中途做一些其它的操作,然后再继续进行组件内部操作。
需求:
假设现在有一段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,我想会来的更简单一些,但是也需要编码。
需求:
假设现在有一段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)这就能成功了,很是困惑。
需求:
假设现在有一段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)这就能成功了,很是困惑。
具体实现就要你去试验了,