使用 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 文件 的相关文章

  • 使用 Python 从原始帧创建 MPEG4 视频文件

    我有一个原始视频帧源 我可以在 Python 中访问它 我想用它创建一个 MPEG4 视频 并带有 MP3 背景音乐 Python 中有哪些类型的工具和库可用于此类任务 最好我想要一个 API 我可以为其提供输出文件名 然后将各个帧作为 2
  • 在您的应用程序 Swift 代码上启动 Youtube 频道

    我花了几天时间找到从我的应用程序打开 youtube 频道的 Swift 代码 但我根本找不到 有人可以帮助我吗 我需要 Swift 中的代码 Swift 3 和 iOS 10 的更新 好的 下面是如何在 Swift 3 中做到这一点 基本
  • 为视频添加水印的命令

    我尝试在一个视频上添加水印 但 FFmpeg 命令不会执行 错误代码为 3037 我运行相同的代码来修剪视频 视频已成功修剪 因此没有问题inputpath or outputpath我也有ic watermark png在资产文件夹中 我
  • 如何在我的 gstreamer 中启用 httpsrc 插件?

    我尝试使用以下命令播放通过 http 检索的 mp3 文件或流 gst launch httpsrc location http domain com music mp3 mad osssink 但出现以下错误 ERREUR le pipe
  • HTML 5

    尽管开放视频标准似乎处于某种危险之中 但它是一个好主意 我看到了一些关于运动跟踪的演示 只是概念验证 但仍然很有趣 现在 我想说像这样的概念really如果能够访问用户的网络摄像头 这将是一种收获 想象一下 双手举在半空中浏览 Flickr
  • VideoView SeekTo 在不同设备上工作异常 - Android

    我在视频视图上使用此代码来寻求自定义位置 但它在三星设备上工作正常 但在索尼设备上 视频寻求开始位置 开始 我想让视频回到上次暂停的位置 创建视频视图 VideoView mVideoPlayer setVideoPath ViDpath
  • ffmpeg通过添加框或边框来扩展(而不是调整大小)视频大小

    假设我有一个特殊分辨率的视频 例如 1280x718 我想将其更改为 1280x720 但我宁愿只在顶部和底部添加一行 而不是将 718 像素垂直插值到 720 所以基本上 我正在寻找一种方法告诉 ffmpeg 创建 1280x720 的输
  • 如何在 Angular2 中嵌入视频?

    我想开发单页应用程序 它是一个视频门户 用户可以登录 查看视频列表 导航到单个视频 对视频进行评分 并可以执行所有媒体相关任务 例如 播放 暂停 调整音量和寻找视频位置 既然有
  • Android 上的 GStreamer

    谁能给我一些关于让 GStreamer 在 Android 上工作的提示 我以前从未使用过它 我想将它与 FFmpeg 一起使用 我已经编译了 FFmpeg 并且在 Android 上运行良好 我只是想使用 GStreamer 来帮助完成一
  • 仅使用 url 嵌入视频

    给定一个 youtube url 我如何使用 net c 将视频嵌入到页面中 只需添加如下一行 将 autoplay 设置为 0 或 1 取决于您是否希望人们真正留在您的页面上
  • 学习 GObject 和 Glib 的材料 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我对 C 很满意 但需要学习GObject and Glib for gstreamer 我在网上找到
  • Android - 如何合并两个视频

    基本上 我正在寻找一种将两个 mp4 视频文件 在 SD 卡上 组合在一起的方法 更像是在第一个视频的末尾附加第二个视频 我进行了很多搜索 但找不到合适的解决方案 好吧 我根本找不到任何解决方案 所以我的问题是 是否有一个库可以组合 并可能
  • 重新采样 H264 视频以降低帧速率,同时保持高图像质量

    以下是感兴趣的视频的 mplayer 输出 br carina tmp mplayer foo mov mplayer Symbol ff codec bmp tags has different size in shared object
  • 无法在 Windows 7 机器中使用 OpenCV 2.4.3、Python 2.7 打开“.mp4”视频文件

    我目前正在进行一个涉及读取 mp4 视频文件的项目 我遇到的问题是它在Windows 7机器上使用Python 2 7 32位 OpenCV 2 4 3 cv2 pyd 代码片段如下 try video cv2 VideoCapture v
  • 如何使用javascript将视频文件转换为字符串?

    我在 signalR 工作 我想通过将视频文件拆分为不同部分来将视频文件从一个客户端发送到另一个客户端 我已经通过分割图像源数据发送图像并在另一个客户端上接收该图像 document getElementById fileUpload ad
  • 如何在 WPF 中从原始帧渲染视频?

    我有一个特殊的摄像机 使用 GigEVision 协议 我使用提供的库进行控制 我可以订阅帧接收事件 然后通过 IntPtr 访问帧数据 在我的旧 WinForms 应用程序中 我可以通过从数据创建 Bitmap 对象并将其设置为 Pict
  • 在 ffmpeg 中,如何使用scale2ref 过滤器缩放 dvdsub 字幕以匹配视频大小?

    我有一个从直播电视录制的 mpeg 文件 其中包含视频以及多个音频和字幕流 我的最终目标是能够创建较小的视频文件 因为 mpeg 文件大小为数 GB 我在这条道路上的第一步只是能够选择视频 音频和字幕流中的每一个并将它们复制到 mkv 文件
  • 我如何对 youtube 嵌入播放器进行编程,使其在点击时取消静音

    如何设置 YouTube 嵌入式播放器在单击时取消静音 你可以看到我提到的嵌入式播放器http www harvestarmy org http www harvestarmy org主页 右边的那个写着 来自 YouTube 的最新视频
  • 如何制作过期/签名视频嵌入网址

    我是新来的 正在学习网络开发等等 我只知道如何将我的视频嵌入网站中 任何菜鸟都可以轻松获得源代码 他们也可以嵌入它 但在许多网站中 视频 src 均使用重定向器链接进行编码 例如 它会在一段时间后过期 在本例中是一天 我了解到这是一个签名网
  • iOS 如何触发视频退出全屏后继续播放?

    我正在构建一个在 iOS 中播放视频的网站 我有一个在 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