FFmpeg解码.mp4视频文件

时间:2016-03-03 12:08:16

标签: c video ffmpeg mp4 libavcodec

我正在开发一个需要打开.mp4文件格式的项目,逐个读取它的帧,解码它们并使用更好的无损压缩类型对它们进行编码并将它们保存到文件中。

如果我对做事的顺序错了,请纠正我,因为我不是100%确定应该怎么做这件事。根据我的理解,它应该是这样的:

1. Open input .mp4 file
2. Find stream info -> find video stream index
3. Copy codec pointer of found video stream index into AVCodecContext type pointer
4. Find decoder -> allocate codec context -> open codec
5. Read frame by frame -> decode the frame -> encode the frame -> save it into a file

到目前为止,我遇到了几个问题。例如,如果我想使用av_interleaved_write_frame()函数保存帧,我无法使用avformat_open_input()打开输入.mp4文件,因为它将填充filename AVFormatContext部分具有输入文件名的结构,因此我无法“写入”该文件。我使用av_guess_format()尝试了不同的解决方案,但是当我使用dump_format()转储格式时,我什么都没得到,所以我找不到关于它使用的编解码器的流信息。

所以如果有人有任何建议,我会非常感激他们。提前谢谢。

2 个答案:

答案 0 :(得分:5)

参见"详细说明"在muxing docs。你:

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

答案 1 :(得分:0)

您可以使用以下内容将视频转换为一系列损失图像

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

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

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

该功能也可通过包装器获得。

您可以在Extracting frames from MP4/FLV?

看到类似的问题