热门标签 | 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)这就能成功了,很是困惑。

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


哈哈,好吧,谢啦~

推荐阅读
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 不确定性|放入_华为机试题 HJ9提取不重复的整数
    不确定性|放入_华为机试题 HJ9提取不重复的整数 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 使用Nginx反向代理实现多域名端口映射
    本文介绍如何通过配置本地hosts文件和Nginx反向代理,实现多个虚拟域名的端口映射,使用户可以通过标准HTTP端口80访问不同后端服务。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
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社区 版权所有