将压缩帧写入 mpeg4 块 c++

Posted

技术标签:

【中文标题】将压缩帧写入 mpeg4 块 c++【英文标题】:Write compressed frames to mpeg4 chuncks c++ 【发布时间】:2012-08-17 14:14:01 【问题描述】:

我希望将已压缩的 (h264) 图像数据写入 MPEG-4 视频文件。由于需要优化此代码以在嵌入式平台上运行,因此代码应尽可能简单。 最好只提供一些标题信息(如高度宽度格式fourcc等)和文件名和压缩数据,并将其转换为数据块并写入该文件。

所以我需要这些:

MPEG-4 标头信息(具体到哪里) 每个数据块是否有主标题或只有标题 单个视频流(矩形)需要哪些标头信息 添加音频需要哪些标头信息 一个简单的 MPEG-4 文件编写器,不需要自己进行压缩,还允许添加音频帧。 (c/c++)

【问题讨论】:

查看此链接,该链接演示了使用 FFMPEG 库编写视频文件:***.com/a/43464269/6180077 【参考方案1】:

.MP4 文件格式在 MPEG-4 Part 14 规范中描述。它不仅仅是主标题和子标题,它有一定的层次结构和所谓的盒子。您选择将数据写入.MP4 文件:

FFmpeg (libavcodec, libavformat) - related Q 和 related code link 在 Windows 中通过 DirectShow API - GDCL MP4 Multiplexer 或许多类似的商业产品 在 Windows 中通过 Media Foundation API - MPEG-4 File Sink

【讨论】:

@ Roman R. 在浪费了大量时间试图让 ffmpeg 工作之后,我才开始研究 GDCL 的复用器。我已经编译了 dll,所以我应该能够在其中调试,但我不知道从哪里开始。您能否向我发送一些示例代码以使用此多路复用器?我已经尝试过 GDCL 网站,但它似乎已关闭(您链接到的网站除外) gdcl.co.uk/mpeg4 复活了。从头开始使用 DirectShow 可能并不容易,因为为了使用这个 MP4 多路复用器,您需要使用这个组件和其他组件创建一个图形,然后运行它。为了将您自己的块注入到图中,您需要一个自定义过滤器来传递这些数据。这不是火箭科学,但它假设对 API 有一定的了解。我什至不确定它是否可以推荐用于嵌入式系统,但是 ffmpeg 删除了剩下的内容。 基本上我会创建一个自定义源过滤器来发送 H.264 块。然后我将它连接到 MP4 多路复用器,然后将其连接到标准 File Writer 组件。一起开始会将数据写入 .MP4 文件。要添加音频,您需要另一个音频源过滤器(通常是 AAC),并且多路复用器也有另一个输入,将所有这些都放入生成的单个 .MP4

以上是关于将压缩帧写入 mpeg4 块 c++的主要内容,如果未能解决你的问题,请参考以下文章

用 C++ 将 OpenCV 帧写入磁盘:单线程写入速度是不是受磁盘吞吐量以外的任何限制?

如何在不将单独的帧图像写入磁盘的情况下从 C++ 程序中生成的多个图像编码视频?

如何将帧写入视频文件?

将文本写入文件后的mfc c++奇怪的块字符

Spark Job 卡住了将数据帧写入分区 Delta 表

是否可以用熊猫逐块写入json