FFmpeg-chapter7和chapter8-使用 FFmpeg 解码视频(原理篇和实站篇)

解码流程如下图

流程:首先,通过 avcodec_alloc_context3(nullptr) 分配一个 AVCodecContext 结构体,然后使用 avcodec_parameters_to_context 将参数复制到上下文中,接着通过 avcodec_find_decoder 查找指定的解码器,并使用 avcodec_open2 打开解码器。

接下来,使用 av_read_frame 从输入流中读取帧,如果读取到帧,则使用 avcodec_send_packet 将帧发送到解码器。然后,通过 avcodec_receive_packet 接收解码后的帧,如果接收到帧,则进一步处理。

如果没有接收到帧,则继续读取下一帧。

最后,当所有帧处理完毕后,使用 avcodec_close 关闭解码器,并使用 avcodec_free_context 释放上下文内存。

具体函数:

  1. avcodec_alloc_context3(nullptr)

    • 作用:分配一个 AVCodecContext 结构体,用于存储解码器的上下文信息。

    • 返回值 :返回一个指向 AVCodecContext 的指针 codecContext

  2. avcodec_parameters_to_context

    • 作用:将 AVCodecParameters 中的参数复制到 AVCodecContext 中,以便解码器能够正确地初始化。

    • 参数:通常是从 AVFormatContext(如从文件读取)中获取的参数。

  3. avcodec_find_decoder

    • 作用:查找指定的解码器。

    • 返回值 :返回一个指向 AVCodec 的指针 codec

  4. avcodec_open2

    • 作用:打开解码器,初始化解码器上下文。

    • 参数:需要传递 AVCodecContext 和 AVCodec。

  5. av_read_frame

    • 作用:从输入流中读取一个视频帧(或音频帧)。

    • 返回值:成功返回 0,失败返回负值。

  6. 判断是否读取到帧

    • 作用:检查是否成功读取到帧。

    • :继续处理。

    • :跳转到 avcodec_send_packet(nullptr)

  7. avcodec_send_packet

    • 作用:将读取到的 AVPacket 发送到解码器。

    • 参数:AVPacket。

  8. avcodec_receive_packet

    • 作用:从解码器中接收解码后的 AVPacket。

    • 返回值:成功返回 0,失败返回负值。

  9. 判断是否取到帧

    • 作用:检查是否成功接收到帧。

    • :继续处理。

    • :跳转到 avcodec_receive_frame

  10. avcodec_receive_frame

    • 作用:从解码器中接收解码后的 AVFrame。

    • 返回值:成功返回 0,失败返回负值。

  11. 判断是否取到帧

    • 作用:检查是否成功接收到帧。

    • :继续处理。

    • :跳转到 avcodec_close

  12. avcodec_close

    • 作用:关闭解码器。
  13. avcodec_free_context

    • 作用:释放 AVCodecContext 的内存。

流程图的逻辑

  • 初始化解码器:从分配上下文到打开解码器。

  • 读取帧:从输入流中读取帧,并发送到解码器。

  • 接收解码后的帧:从解码器中接收解码后的帧。

  • 循环处理:直到所有帧都被处理完毕。

  • 关闭解码器:释放资源。

具体代码在这里:https://github.com/StudyWinter/MMAVPlayer/tree/main/chapter8

相关推荐
REDcker7 天前
WebCodecs VideoDecoder 的 hardwareAcceleration 使用
前端·音视频·实时音视频·直播·webcodecs·videodecoder
gihigo19987 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
山河君8 天前
四麦克风声源定位实战:基于 GCC-PHAT + 最小二乘法实现 DOA
算法·音视频·语音识别·信号处理·最小二乘法·tdoa
音视频牛哥8 天前
Android平台RTMP/RTSP超低延迟直播播放器开发详解——基于SmartMediaKit深度实践
android·人工智能·计算机视觉·音视频·rtmp播放器·安卓rtmp播放器·rtmp直播播放器
qq_416276428 天前
通用音频表征的对比学习
学习·音视频
美狐美颜sdk8 天前
Android全局美颜sdk实现方案详解
人工智能·音视频·美颜sdk·视频美颜sdk·美狐美颜sdk
EasyDSS8 天前
私有化部署EasyDSS视频点播能力:全链路视频技术赋能,打造企业级视听新体验
音视频·hls·m3u8·点播技术·智能转码
qq_416276428 天前
DeLoRes——一种通用的音频表征学习新方法(DeLoRes(基于 Barlow Twins 的冗余最小化方法)
学习·音视频
Q_4582838688 天前
从定位到视频:808 + 1078 在各行业的落地实践
音视频
山顶望月川8 天前
实测MiniMax-Hailuo-02:当“开工大吉“变成“无字天书“,国产AI视频模型的能与之不能
人工智能·音视频