音视频教程-第四节

💡 原文中文,约13300字,阅读约需32分钟。
📝

内容提要

本文介绍了使用FFmpeg解码视频帧的过程,重点讲解了AVPacket与AVFrame的区别、解码流程及YUV格式。学习者将掌握打开解码器、读取和解码视频帧、获取YUV数据、统计解码帧数和保存YUV文件的实践内容,并提供常见问题解答以帮助理解解码器的使用和YUV文件的处理。

🎯

关键要点

  • AVPacket 表示压缩后的编码数据,需要解码后才能使用;AVFrame 表示解码后的原始数据,可以直接用于渲染或处理。

  • 解码流程包括打开解码器、读取数据包、发送数据包到解码器、接收解码后的帧、处理帧数据,直到文件结束。

  • YUV 是一种颜色编码格式,常见的格式有 YUV420P、YUV422P 和 YUV444P,YUV420P 是最常用的格式。

  • AVCodecContext 结构体包含编解码器的配置信息,如视频分辨率、像素格式等。

  • 使用 av_read_frame 读取数据包,使用 avcodec_send_packet 发送数据包到解码器,使用 avcodec_receive_frame 接收解码后的帧。

  • 解码后的 YUV 数据可以通过 AVFrame 的 data 和 linesize 字段访问,linesize 可能大于 width。

  • 可以统计解码帧数和帧率,通过 PTS 计算实际帧率。

  • YUV 文件是原始数据,没有容器格式,写入时需要注意只写入实际宽度,使用 ffplay 查看时需要指定分辨率、像素格式和帧率。

  • YUV 文件无法直接用普通播放器打开,必须使用 ffplay 等工具,并手动指定参数。

  • 可以通过将 YUV 文件转换回 MP4 来验证数据的正确性。

🔎

延伸解读

AVPacket与AVFrame的核心区别

AVPacket和AVFrame是FFmpeg解码过程中两个重要的概念。AVPacket代表压缩后的数据,必须经过解码才能使用,而AVFrame则是解码后的原始数据,可以直接用于渲染或处理。理解这两者的区别,有助于更好地掌握视频解码的流程和数据处理。

YUV格式的应用与注意事项

YUV格式在视频处理中广泛使用,尤其是YUV420P格式因其较低的存储需求而成为主流。在处理YUV数据时,需注意linesize可能大于width,这与内存对齐有关。确保在写入文件时只写入实际宽度,以避免数据错误。

解码流程中的常见问题

在解码过程中,常见问题包括如何处理avcodec_send_packet返回的AVERROR(EAGAIN)和为何需要循环调用avcodec_receive_frame。理解这些问题的根源,有助于提高解码效率,确保所有帧都能被正确处理。

延伸问答

AVPacket和AVFrame有什么区别?

AVPacket表示压缩后的编码数据,需要解码后才能使用;AVFrame表示解码后的原始数据,可以直接用于渲染或处理。

解码视频帧的基本流程是什么?

解码流程包括打开解码器、读取数据包、发送数据包到解码器、接收解码后的帧、处理帧数据,直到文件结束。

YUV格式有哪些常见类型?

常见的YUV格式有YUV420P、YUV422P和YUV444P,其中YUV420P是最常用的格式。

如何统计解码的帧数和帧率?

可以通过记录解码的帧数和使用PTS计算实际帧率,方法是计算第一帧和最后一帧的PTS差值。

为什么YUV文件无法直接用普通播放器打开?

YUV文件是原始像素数据,没有容器格式和文件头,播放器无法自动识别分辨率、像素格式等信息。

如何验证保存的YUV文件是否正确?

可以使用ffplay播放YUV文件,或将YUV文件转换回MP4格式进行验证。

🏷️

标签

➡️

继续阅读