FFMPEG 如何将 MJPEG 编码数据复用到 mp4 或 avi 容器 c++

Posted

技术标签:

【中文标题】FFMPEG 如何将 MJPEG 编码数据复用到 mp4 或 avi 容器 c++【英文标题】:FFMPEG how to mux MJPEG encoded data into mp4 or avi container c++ 【发布时间】:2012-09-29 15:26:48 【问题描述】:

我正在寻找一种将 mjpeg(压缩)视频数据复用到 mp4 或 avi 等视频容器中的方法。 (我将来还需要添加音频)。 因为我在项目的其他部分也使用 FFMPEG,所以如果可能的话,我想使用这些库。 我不是在寻找命令行 FFMPEG 使用! 我尝试在 ffmpeg 中使用 muxing 示例,我只能创建一个(非常大的)带有视频信息的 .mjpeg 文件。这不是我要找的。​​p>

非常欢迎提供示例,但指向正确方向的指针也可以!

编辑: 我已将 yuvj422p 流输出到 jpeg 图像,我想将其放入 mp4 容器中。使用 ffmpeg 命令行可以:

ffmpeg -i yuvy%01d.jpg -vcodec mjpeg out.mp4

我想直接在我的代码中执行此操作(当然不首先创建 jpeg 图像)

【问题讨论】:

【参考方案1】:

我做了以下修复:

我使用了复用示例,而不是使用编码函数,我只是跳过它,直接将 JPEG 数据加载到数据包中。为了设置 OutputContext,我使用了猜测格式函数并将编解码器设置为 MJPEG。我将 PTS 数据更改为帧计数器。因为无论如何所有帧都是按时间顺序排列的。

【讨论】:

【参考方案2】:

三大步骤

    解码(使用 avcodec_decode_video()) 将原始帧转换为 yuv420p 格式(使用 swscale()) 编码(使用avcodec_encode_video())

如果您需要,我可以提供示例代码

【讨论】:

发帖人应该已经完成​​了这一切。现在他手头有 JPEG,他想将帧写入视频文件。 好的,然后只有第 2 步和第 3 步,因为如果我没记错的话,jpeg 帧在 yuvj422p 中 我在嵌入式平台上运行编码,得到一个原始的 yuvj422p 编码比特流。我想直接把它放到一个 mp4 容器中。解码和编码会花费太多的周期时间。 @arash kordi:不,他需要接下来的第 4 步 让我澄清一下,您是从原始 yuvj422p 比特流还是从 jpeg 图像创建了一个 .mjpeg 文件?

以上是关于FFMPEG 如何将 MJPEG 编码数据复用到 mp4 或 avi 容器 c++的主要内容,如果未能解决你的问题,请参考以下文章

使用 ffmpeg 将多个单视频 MPEG-TS 多路复用到 MPTS

ffmpeg 将 rtsp 重新流式传输到 mjpeg

mjpeg解码到rgb

Android开发之《ffmpeg解码mjpeg视频流》

ffmpeg实现mjpeg摄像头的采集-预览-拍照

使用 FFMPEG 裁剪视频时出错