FFmpeg 解码.mp4 视频文件

问题描述 投票:0回答:2

我正在开发一个项目,需要打开

.mp4
文件格式,一一读取其帧,对它们进行解码并使用更好的无损压缩类型对其进行编码,然后将它们保存到文件中。

根据我的理解,应该是这样的:

  1. 打开输入.mp4文件
  2. 查找流信息 -> 查找视频流索引
  3. 将找到的视频流索引的编解码器指针复制到 AVCodecContext 类型指针
  4. 查找解码器 -> 分配编解码器上下文 -> 打开编解码器
  5. 逐帧读取 -> 解码帧 -> 编码帧 -> 保存到文件中

到目前为止,我遇到了几个问题。例如,如果我想使用

av_interleaved_write_frame()
函数保存一帧。我无法使用
.mp4
打开输入
avformat_open_input()
文件,因为它将使用输入文件名填充
filename
结构的
AVFormatContext
部分,因此,我无法“写入”该文件。

我尝试了使用

av_guess_format()
的不同解决方案,但是当我使用
dump_format()
转储格式时,我什么也没得到,所以我找不到有关它正在使用哪个编解码器的流信息。

这应该怎么做?

c video ffmpeg mp4 libavcodec
2个回答
6
投票

请参阅mushing 文档中的“详细说明”。你:

  1. 使用 av_guess_format 设置 ctx->oformat
  2. 使用 avio_open2 设置 ctx->pb
  3. 为输出文件中的每个流调用 avformat_new_stream。如果您要重新编码,则可以将输入文件的每个流添加到输出文件中。
  4. 调用avformat_write_header
  5. 循环调用av_interleaved_write_frame
  6. 致电
  7. av_write_trailer
  8. 关闭文件(
  9. avio_close)并清除所有分配的内存

-3
投票
您可以使用以下方法将视频转换为一系列损失图像:

ffmpeg -i video.mp4 image-%05d.png

然后从一系列图像返回到视频:

ffmpeg -i image-%05d.png video.mp4

该功能也可以通过包装器使用。

您可以在以下位置看到类似的问题:

从 MP4/FLV 中提取帧?

© www.soinside.com 2019 - 2024. All rights reserved.