FFmpeg解码.mp4视频文件
FFmpeg decoding .mp4 video file
我正在做一个需要打开 .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 文件,因为它会填充 AVFormatContext
的 filename
部分具有输入文件名的结构,因此我无法 "write" 进入该文件。我使用 av_guess_format()
尝试了不同的解决方案,但是当我使用 dump_format()
转储格式时,我什么也没得到,所以我找不到关于它使用哪个编解码器的流信息。
因此,如果有人有任何建议,我将不胜感激。提前谢谢你。
您可以将视频转换为一系列损失图像:
ffmpeg -i video.mp4 image-%05d.png
然后从一系列图像回到视频:
ffmpeg -i image-%05d.png video.mp4
该功能也可通过包装器使用。
您可以在以下位置看到类似的问题:Extracting frames from MP4/FLV?
参见 muxing docs 中的 "detailed description"。你:
- 设置 ctx->oformat using av_guess_format
- 设置 ctx->pb using avio_open2
- 为输出文件中的每个流调用 avformat_new_stream。如果您要重新编码,这是通过将输入文件的每个流添加到输出文件中。
- 致电avformat_write_header
- 循环调用av_interleaved_write_frame
- 致电av_write_trailer
- 关闭文件 (avio_close) 并清除所有分配的内存
我正在做一个需要打开 .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 文件,因为它会填充 AVFormatContext
的 filename
部分具有输入文件名的结构,因此我无法 "write" 进入该文件。我使用 av_guess_format()
尝试了不同的解决方案,但是当我使用 dump_format()
转储格式时,我什么也没得到,所以我找不到关于它使用哪个编解码器的流信息。
因此,如果有人有任何建议,我将不胜感激。提前谢谢你。
您可以将视频转换为一系列损失图像:
ffmpeg -i video.mp4 image-%05d.png
然后从一系列图像回到视频:
ffmpeg -i image-%05d.png video.mp4
该功能也可通过包装器使用。
您可以在以下位置看到类似的问题:Extracting frames from MP4/FLV?
参见 muxing docs 中的 "detailed description"。你:
- 设置 ctx->oformat using av_guess_format
- 设置 ctx->pb using avio_open2
- 为输出文件中的每个流调用 avformat_new_stream。如果您要重新编码,这是通过将输入文件的每个流添加到输出文件中。
- 致电avformat_write_header
- 循环调用av_interleaved_write_frame
- 致电av_write_trailer
- 关闭文件 (avio_close) 并清除所有分配的内存