使用 gstreamer 1.12.2 将 MPEG-TS 分割为 MP4 文件

2023-12-13

我有一个 MPEG-TS 文件,其中包含两个视频/音频流对:

$ gst-discoverer-1.0 Recorder_Aug01_12-30-39.ts
Analyzing Recorder_Aug01_12-30-39.ts
Done discovering Recorder_Aug01_12-30-39.ts

Topology:
  container: MPEG-2 Transport Stream
    audio: MPEG-2 AAC
      audio: MPEG-4 AAC
    video: H.264 (High Profile)
    audio: MPEG-2 AAC
      audio: MPEG-4 AAC
    video: H.264 (High Profile)

Properties:
  Duration: 0:01:49.662738259
  Seekable: yes
  Tags: 
      audio codec: MPEG-2 AAC
      video codec: H.264

现在我想将第一个视频和音频流以及第二个视频/音频提取到两个单独的 MP4 容器中。

使用简单的管道并行显示两个视频流:

$ gst-launch-1.0 filesrc location=Recorder_Aug01_12-30-39.ts ! tsdemux name=ts \
    ts.video_0_0102 ! queue ! h264parse ! avdec_h264 ! videoconvert ! videoscale ! autovideosink \
    ts.video_0_0100 ! queue ! h264parse ! avdec_h264 ! videoconvert ! videoscale ! autovideosink

当我介绍mp4mux与一个filesink一个流上的元素仍然有效,显示第一个视频流,第二个视频保存到 MP4 容器文件中:

$ gst-launch-1.0 filesrc location=Recorder_Aug01_12-30-39.ts ! tsdemux name=ts \
    ts.video_0_0102 ! queue ! h264parse ! avdec_h264 ! videoconvert ! videoscale ! ximagesink \
    ts.video_0_0100 ! queue ! h264parse ! mp4mux ! filesink location=2.mp4

现在我的问题是:一旦我尝试通过文件接收器保存两个流,它就会失败:

$ gst-launch-1.0 filesrc location=Recorder_Aug01_12-30-39.ts ! tsdemux name=ts \
    ts.video_0_0102 ! queue ! h264parse ! mp4mux ! filesink location=1.mp4 \
    ts.video_0_0100 ! queue ! h264parse ! mp4mux ! filesink location=2.mp4
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
ERROR: from element /GstPipeline:pipeline0/GstMP4Mux:mp4mux0: Could not multiplex stream.
Additional debug info:
gstqtmux.c(3486): gst_qt_mux_add_buffer (): /GstPipeline:pipeline0/GstMP4Mux:mp4mux0:
Buffer has no PTS.
Execution ended after 0:00:00.001992389
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...

我想使用 gstreamer 来实现这一点,因为它稍后应该成为需要大量自省的更大处理工作流程的一部分,因此使用ffmpeg或者某些外部二进制文件不是一个选项。


GStreamer Buffer 没有 PTS 故障模式

这可能无法完全解决使用 GStreamer 的问题,但这是我现在正在使用的解决方法。它涉及隔离出故障组件,即 gstreamer 管道中的“mp4mux”元素。

我发现即使是 Gstreamer 中的示例视频编码目前也失败,例如Buffer没有PTS故障模式:

gst-launch-1.0 videotestsrc num_buffers=300 ! videoconvert ! videoscale ! omxh264enc ! h264parse ! mp4mux ! filesink location=test.mp4

仅使用 Gstreamer 进行 h264 编码。

删除 mp4mux 元素使我们能够成功创建 .h264 文件。如果您使用 Raspberry Pi omxh264 编码器元件,则特别方便。

gst-launch-1.0 videotestsrc num_buffers=300 ! videoconvert ! videoscale ! omxh264enc ! filesink location=test.h264

解决音视频混合问题

现在,为了将其转换为 MP4(最初的目标),我们可以使用漂亮的轻量级 Gpac MP4box。

sudo apt-get install gpac

MP4Box -isma -inter 250 -fps 30.0 -mpeg4 -hint -noprog -add test.h264 test.mp4

然后你可以添加你的音频

MP4Box -add audio.mp3 test.mp4

Summary

  1. 使用 Mp4Mux 元素时,GStreamer 当前似乎因无 PTS 故障模式而损坏。
  2. GStreamer 通用 h264 编码和管道非常棒,并且工作正常。
  3. 使用 GPac 将音频合并到 Mp4 文件中是一个可行的替代方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 gstreamer 1.12.2 将 MPEG-TS 分割为 MP4 文件 的相关文章

  • Html 视频播放器播放声音但不播放视频

    我正在制作网页 并尝试插入视频 视频播放器加载正常 您可以按播放 但只播放音频 而不播放视频 在 Chrome 中预览时 在 firefox 中查看时可以正常工作 我的代码如下
  • 如何在 vc++ 中使用samplegrabber?样本采集器未定义

    在视觉社区 2015 我有一个 C 项目 在 cpp 文件顶部我有 include stdafx h include VideoCaptureFilterSample h include VideoCaptureFilterSampleDl
  • iPad 2 的 HTML5 源元素错误是否已修复?

    根据这个页面 http camendesign com code video for everybody webm http camendesign com code video for everybody webm 第一个 iPad 有一
  • 为什么我可以在css中将gif设置为背景图片url(),但无法将视频mp4设置为背景url?

    为什么我可以在css中将gif设置为背景图片url 但无法将视频mp4设置为背景url 我尝试了一切 甚至将 url 设置为指向 svg 该 svg 中包含在 src 属性中编码为 base64 的异物视频 但行不通 我不需要 video
  • AVAssetExportSession 输出文件

    AVAssetExportSession 输出文件应该是什么样子 我正在尝试压缩 ALAsset 项目中的视频 但它不起作用 我猜输出文件与它有关 这是我正在使用的代码 NSString destinationPath NSHomeDire
  • Python中使用cv2获取当前视频播放位置

    我正在尝试使用 CV2 和 Python 从播放视频中获取当前播放时间位置 如果可能 以毫秒为单位 目前我正在使用此示例代码来播放视频文件 import cv2 import numpy as np file name 2 mp4 wind
  • ffmpeg 命令行,用于使用 Windows 7 从 Decklink 卡捕获(和录制)720p 音频和视频

    我正在尝试使用 Windows 7 720p 从 blackmagic Decklink 捕获卡捕获音频和视频 但我似乎无法正确获取 ffmpeg 命令行设置 ffmpeg list devices true f dshow i 虚拟 ds
  • AVAssetExportSession.requestExportSession 回调从未被调用(swift 3,iOS10)

    以下代码从不调用导出回调 导出会话创建得很好 我没有看到任何错误 也没有任何进展 CPU 为 0 我认为没有例外 状态为 1 进行中 进度为 0 错误为零 视频在画廊中播放 我可以成功获取视频的图像 我已将代码提取到单个 UIViewCon
  • OpenCV:处理每一帧

    我想使用 OpenCV 编写一个跨平台应用程序进行视频捕获 在所有示例中 我发现来自相机的帧是使用抓取功能进行处理并等待一段时间 我想处理序列中的每一帧 我想定义自己的回调函数 每次当一个新帧准备好处理时都会执行该函数 例如直播对于 Win
  • as3 - 如何停止视频并分离 NetStream

    我有来自服务器的视频流 稍后我想并排添加另一个视频 那就好 我做到了 现在当我想删除视频时我的问题来了 我设法将其从显示中删除 但我可以听到视频仍在后台播放 那么我怎样才能停止播放该视频呢 这是我设置视频的代码 ns new NetStre
  • 如何在列表视图中选择时启用视频序列自动播放?

    大家好 有人可以与我分享一下我如何编写我的 viewvideo java 类 以便它允许自动播放视频功能 自动排序在列表视图中播放所选视频的任务 从当前位置到最新录制的视频 按顺序直到最新的视频播放完毕 这类似于 YouTube 自动播放功
  • QPainter 性能高帧率

    我试图在 QPainter 中以 60fps 的速度显示视频 在 OpenGLwidget 中 我遇到一个问题 有时绘图花费的时间太长 并且在使用 QPainter 时发生下一个重绘事件 这会生成警告和随机崩溃 有几个问题 是否有一种 Qt
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • C#中图像制作视频的工作方式

    有人有已知的可靠方法来从一系列图像文件创建视频吗 在你因为我在发布问题之前没有寻找答案而对我进行批评之前 以及在你发出诸如 使用 FFMPEG 之类的简单消息之前 请阅读此消息的其余部分 我正在尝试从一系列图像 jpg bmp 等 创建视频
  • 使用 MP4 编码在 Flash 中流式传输网络摄像头视频

    我正在开发的 Flash 应用程序的功能之一是能够将网络摄像头流式传输给其他人 我们只是使用 Flash 中的内置网络摄像头支持并通过 FMS 发送它 有些人要求更高质量的视频 但我们已经在 Flash 中使用了最高质量设置 将质量设置为
  • 如何在JavaFX中播放其他视频格式

    我正忙于电影 视频剪辑播放器 库 我想在 JavafX 中做到这一点 几乎 90 的视频剪辑都是 AVI 格式 由于多种原因 我无法隐藏电影 视频剪辑 我还希望该程序能够标记已播放的视频文件 从开始到结束 以便我知道观看了什么 因此程序需要
  • ImportError:无法导入名称 GstRtspServer,未找到内省类型库

    我目前正在尝试让一个简单的 GstRtspServer 程序在外部亚马逊 Linux EC2 服务器上运行 但在让它实际运行时遇到了严重的问题 无论我做什么 当我尝试运行它时 即使程序仅减少到 import gi gi require ve
  • MediaRecorder 纵向模式下的视频捕获

    我正在尝试制作自定义视频应用程序 Iwork 使用清单中的设置仅 2 2 API 8 一切顺利 但我不明白为什么纵向模式视频与横向模式视频没有区别 为了检测设备改变的方向 我在 surfaceChanged 中使用此代码 if mCamer
  • 将视频输入流转换为 RTMP

    我想将 Android 手机中的视频录制流式传输到网络媒体服务器 第一个问题是设置时MediaRecorder输出到套接字 流丢失了一些mdat大小标题 这可以通过在本地预处理流并将丢失的数据添加到流中以生成有效的输出流来解决 问题是如何从
  • 在 IOS 10 beta 7 (Safari) 中使用 webGL 渲染视频 - 显示奇怪的紫色

    我正在 webGL 中渲染视频 通过传递Video对象作为源texImage2D 这在所有平台 支持 webGL 中都很好用 但是在 IOS 10 beta 7 的 Safari 中 它以奇怪的颜色渲染 在以前的 IOS 版本中看起来还不错

随机推荐

  • NSWindow翻转动画(简单通用)

    如何在不进行复杂编码的情况下为 OS X 应用程序窗口制作翻转动画 最后 我做到了 我创建了与 NSWindowController 对象而不是 NSWidows 一起使用的对象 ALWindowFlipAnimator h import
  • 谷歌地图 API v3 |没有显示地图数据

    我正在为我们当地的消防员之家编写一个小型 JavaScript 应用程序 该应用程序有点像 powerpoint 等 但是是 html 格式的 在此应用程序中 我将显示一个谷歌地图 其中包含显示从消防员家到火灾地点的路线 我使用 jquer
  • python tkinter从命令中使用的函数返回值[重复]

    这个问题在这里已经有答案了 如何获取A到C的返回值 顺便说一下 我没有使用类 def button mylabel Label myGui text hi grid row 0 column 0 A B get return A B Str
  • 创建许可系统[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我为我工作的公司开发了一个信息管理系统 现在我想制作一种许可系统 以帮助防止任何人仅仅获取副本并将其设置在自己的家庭服务器上并将其用于任何目的 我知道也许最简单的方法是在系统的每
  • 将十六进制地址传递给指针变量

    我知道如何使用指针 但我不知道该怎么做 我有一个十六进制地址 当然它具有来自任何应用程序的任何值 我知道找到我想要的地址 我想编写一段 C 代码来将此地址传递给指针变量 然后我可以从该地址捕获值 依此类推 例如 hex 0x00010010
  • 将列名传递给函数

    我有一个非标准评估的简单问题 将变量名作为参数传递到函数中 作为一个可重现的例子 这是一件简单的事情 取一个变量的平均值 mpg来自mtcars数据集 我的最终目标是拥有一个可以输入数据集和变量并获取平均值的函数 所以没有函数 librar
  • 如何在 URL 中隐藏控制器名称?

    如何在 URL 中隐藏控制器名称 我使用 ASP NET MVC 原来的网址是 http www sample com Users mvc UserDetail 9615 Users 是控制器名称 UserDetail 是操作名称 9615
  • PCRE 正则表达式 到 sed 正则表达式

    首先 我很抱歉我的英语不好 我是一个德国人 下面给出的代码在 PHP 中运行良好 string preg replace href i href 1 string 现在T需要同样的sed 我认为应该是 sed s href href 1 g
  • 如何在您的应用程序中使用标准 Mac OS X 图标?

    如何在您的设计 应用程序中使用标准 Mac OS X 图标 By standard icons I mean toolbar icons from this screenshots 是否有存储这些文件的位置或有什么方法可以从 Mac OS
  • 水平和垂直手风琴

    我想在 asp net 中创建水平和垂直的手风琴 我已经使用 Ajax Toolkit Accordion 但无法更改其方向 created using ajax toolkit looking for this 这是 ASP NET C
  • 可从时间戳列表中观察到

    如果我有一个包含时间戳的对象列表 如何制作一个在时间戳之间的相对时间触发事件的可观察对象 例如 如果我有三个时间戳为 2014 01 01 10 30 2014 01 01 10 45 和 2014 01 01 11 30 的对象 我希望第
  • Service Fabric:是否可以同时运行 Linux 和 Windows 节点

    是否可以在 Azure Service Fabric 上的同一群集中同时运行 Linux 和 Windows 节点 不 目前这是不可能的
  • python paho mqtt无法使用用户名和密码连接到mqtts

    我的 raspberrypi 上的以下 python 代码无法连接到我的 mqtt 代理 它只是在打印后挂起Connecting import paho mqtt client as mqtt def on connect client u
  • Cakephp foreach 条件

    我必须显示 3 份预订的预订表 它应该显示 3 行 3 项预订 但它只显示一行 在控制器中 public function index hote this gt Reservation gt recursive 1 this gt load
  • 使用 jQuery 从 HTML 创建 JSON 对象

    问题概述 假设我有一批糖果 这批货物有许多盒子 每个盒子都有许多独特的糖果类型 每个盒子都有一个唯一的ID 与其他盒子不同 糖果类型也是如此 此外 糖果还有其他特征 如颜色 味道和数量 示例代码 采取以下 HTML 示例 div class
  • 由给定数字相加形成的所有可能的数字

    如果我有n r数字 从1 to n where r中间缺少数字 那么我如何计算这些数字相加可以形成的所有可能数字 以 2 3 4 5 6 为一组 例如 假设我有5 2数字 那是 1 2 4 and 3 5缺失 现在 我可以形成 1 1 2
  • 使用 Java 查找基元数组中的最大/最小值

    编写一个函数来确定数组中的最小值 最大值很简单 例如 param chars return the max value in the array of chars private static int maxValue char chars
  • 如何清除使用 MVC HTML 帮助器定义的文本框

    我不知道如何做这个非常简单的事情 我的页面包含一组文本框 用户可以填写这些文本框以将项目添加到列表中 然后该项目将显示在下拉列表中 此时 我希望清除 添加 文本框 我认为这是大多数用户所期望的行为 该项目已添加 现在文本框应该是空的 准备好
  • GestureDetector onScroll()问题(执行3次)

    我有这段代码来使用 GestureDetector 检测滚动手势 它可以工作 只不过它检测到滚动活动 3 次而不是一次 我怎样才能让它只检测一次 它记录滚动活动 log i 行 3 次 并播放声音 mp start 3 次而不是一次 也导致
  • 使用 gstreamer 1.12.2 将 MPEG-TS 分割为 MP4 文件

    我有一个 MPEG TS 文件 其中包含两个视频 音频流对 gst discoverer 1 0 Recorder Aug01 12 30 39 ts Analyzing Recorder Aug01 12 30 39 ts Done di