【问题标题】:FFmpeg decoding .mp4 video fileFFmpeg 解码 .mp4 视频文件
【发布时间】:2016-06-16 18:11:35
【问题描述】:

我正在开发一个项目,该项目需要打开 .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 部分,因此我无法“写入”该文件。我使用av_guess_format() 尝试了不同的解决方案,但是当我使用dump_format() 转储格式时,我什么也得不到,所以我找不到有关它使用哪个编解码器的流信息。

因此,如果有人有任何建议,我将不胜感激。提前谢谢你。

【问题讨论】:

  • 您是否正在尝试将 .mp4 转换为一系列无损静止图像?
  • 嗯,我正在尝试将 .mp4 文件拆分为帧,压缩它们并通过网络发送它们。在另一端,这些帧将被连接回一个 .mp4 文件。
  • 这有什么意义?并且压缩无损图像是没有意义的。mp4格式已经被设计为一个高效的容器。这个过程很慢,处理器密集,带宽效率低等。
  • 这是因为我需要找出多个编解码器之间的差异,主要目标是将 4k 视频分割成帧,压缩它们并通过 1Gbit 连接发送。所以我需要找出哪个编解码器是最好的压缩方式。作为一个例子,我有我需要做实验的高清文件。

标签: c video ffmpeg mp4 libavcodec


【解决方案1】:

请参阅muxing docs 中的“详细说明”。你:

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

【讨论】:

  • 你知道如何将AVFrame 结构的内容复制到char* buffer,这样我就可以使用winsock2 的send() 函数将该缓冲区发送到不同的进程吗?我正在尝试创建本地服务器-客户端通信,以测量使用不同压缩方法发送帧所需的时间。
  • for (y = 0; y data[0] + y * frame->linesize[0], width)。您还可以使用 avcodec_encode_video2() 来压缩帧(而不是 gzip 左右,这可能是您正在尝试做的)。
  • 嗯,如果我这样做而不是复制整个 AVFrame 结构,考虑到我正在复制原始视频帧,我是否能够对该帧进行编码(仅基于 frame->data[0] 和 @ 987654336@) 在接收方使用avcodec_encode_video2() 函数?
  • 关于压缩,我打算用lzw。我将仔细研究avcodec_encode_video2() 压缩方式。顺便说一句,谢谢你的回复,我真的很感激。
  • 你会用 linesize[1-2] 对 data[1-2] 做​​同样的事情(假设一些平面 YUV 格式),对不起,忘了提这个;或者更确切地说,这取决于您的 pixfmt 的平面数量(请参阅 pixdesc)。
【解决方案2】:

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

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

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

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

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

你可以在Extracting frames from MP4/FLV?看到类似的问题

【讨论】:

  • 我没有使用 ffmpeg 的静态构建,我在自己的项目中使用他们的 API。
  • FFmpeg 是命令行实用程序。您使用的是哪个库和语言? Libavcodec?
  • 我正在使用 libavcodec/format/device/filter/util/postproc/swscale。我正在用 C 语言编写。基本上它是 FFmpeg 的旧开发版本。
  • FFmpeg 是一个项目,其中包含一堆用于 A/V 操作的库和一组可选的二进制文件,例如 ffmpeg、ffplay..etc,它们允许您使用库中可用的功能。跨度>
猜你喜欢
  • 1970-01-01
  • 2013-01-10
  • 2016-01-04
  • 2017-06-20
  • 2012-05-22
  • 2014-07-29
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多