【问题标题】:Implement a simple MPEG-TS muxer using ffmpeg-lib使用 ffmpeg-lib 实现一个简单的 MPEG-TS 复用器
【发布时间】:2023-03-30 14:35:01
【问题描述】:

我有一个应用程序将原始 音频 数据记录在 LPCM 中,存储在缓冲区中。我想将数据封装在传输流中,并通过 UDP 将该传输流发送到另一台主机上的流分段器(根据 HTTP Live Streaming 规范)。

FFmpeg 提供了一个命令行实用程序来执行此操作,但使用文件作为输入 ffmpeg -re -i output.aac -acodec copy -f mpegts udp://127.0.0.1:5555

我的第一个想法是使用 FFmpeg API,尤其是 libavformat 库。 libavformat 是否提供了一个复用器,可用于将 LPCM 中的音频封装到传输流中,还是我必须从头开始实现它?

我找到了这个源代码https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/mpegts.c,但我不确定它是否真的符合我的要求。

感谢您的帮助,

【问题讨论】:

  • libavformat/mpegtsenc.c 是 TS 复用器,但它不复用 LPCM。欢迎补丁。
  • 它有任何类型的文档还是我必须深入研究代码?
  • 个人多路复用器本身没有记录。基本流程是一样的:你初始化,写头(如果适用),写数据包,写尾,deinit。查看文件底部的相关函数。
  • 在通过网络传输时是否必须有 LPCM?作为一种未压缩的格式,您可能无法找到所需的内容,因为它对网络传输效率不高。您可以编码和传输,然后解码回 LPCM 将是一个相当简单的过程。如果你真的只是想通过网络推送 LPCM,只需在套接字上发送它,不需要 ffmpeg
  • @Andrew 不,我不需要转入 LPCM。我的音频是在 LPCM 中原生生成的,但我可以轻松地将其编码为更合适的格式,例如 AAC。但是,我确实需要在 MPEG 传输流中传输它,因为它是服务器进程所期望的。

标签: c++ ffmpeg libavformat transport-stream muxer


【解决方案1】:

因此,根据您关于在 TS 中不需要它一定是 LPCM 的评论,您需要:

  1. 解码您的音频/读取帧
  2. 将其编码为适合在传输流中发送的内容,例如mp3 或 AAC 我相信这是选项列表:https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/mpegts.h#L45-L64
  3. 将其打包在适合您网络条件的 TS 中,例如数据包大小等
  4. 通过 UDP 发送

这里有一个合理的例子:https://github.com/rvs/ffmpeg/blob/master/libavformat/output-example.c

正如 szatmary 之前的回答中提到的,您也可以将其通过管道传输到 ffmpeg,这可能是最简单的

【讨论】:

  • 谢谢。但是我不能使用 ffmpeg 实用程序,因为录制和流媒体都嵌入在我的应用程序中。
  • 该代码示例将用于嵌入您的应用程序中
  • 是的,我知道,我只是指你的最后一句话 :)
【解决方案2】:

您可以通过 libavformat 直接使用 ts muxer。但是,您也可以使用 -i - 将音频通过管道传输到 ffmpeg -

【讨论】:

  • 我的目标是使用 libavformat API 以编程方式复制 ffmeg 实用程序,但无论如何感谢
猜你喜欢
  • 2015-10-03
  • 2012-03-06
  • 2013-02-24
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
相关资源
最近更新 更多