音视频项目—基于FFmpeg和SDL的音视频播放器解析(七)

介绍

在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器

如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视频播放器解析(六)

解析

我们这篇文章解析 decodethread 的四个函数,Init,Start,Stop,Run,如果您对于 decodethread 不是很了解,建议您先去看看上篇文章基于FFmpeg和SDL的音视频播放器解析(六)

Init 函数
int DecodeThread::Init(AVCodecParameters* par){
    if(!par){
        return -1;
    }
    codec_ctx = avcodec_alloc_context3(nullptr);

    int ret = avcodec_parameters_to_context(codec_ctx, par);
    if(ret < 0){
        return -1;
    }

    AVCodec* codec;
    if(codec_ctx->codec_id == AV_CODEC_ID_H264){
        codec = avcodec_find_decoder_by_name("h264_qsv");
    }else {
        codec = avcodec_find_decoder(codec_ctx->codec_id);
    }
    if(!codec){
        return -1;
    }

    ret = avcodec_open2(codec_ctx, codec, nullptr);
    if(ret < 0){
        return -1;
    }
    return 0;
}

这个初始化函数主要负责 AVCodecContext 的初始化。

首先,运用了 avcodec_alloc_context3 为 AVCodecContext 变量 codec_ctx 分配内存。

接着,我们可以看到 avcodec_parameters_to_context 函数,用于将一个 AVCodecParameters 结构体转换为 AVCodecContext 结构体。AVCodecParameters 是 FFmpeg 中用于表示编解码器参数的结构体,包含了编解码器的类型、比特率、帧率、分辨率等信息。而 AVCodecContext 是 FFmpeg 中用于表示编解码器上下文的结构体,包含了编解码器的状态、输入输出缓冲区等信息。

然后,我们需要找相应的解码器并且打开它。

于是,先做一个条件判断,如果解码器上下文的 codec_id 是 AV_CODEC_ID_H264,这是一个 H.264 编解码器的标识符,则通过 “h264_qsv” 的名字找编解码器。否则,调用 avcodec_find_decoder 函数查找合适 codec_ctx 的解码器。总体上,就是一个查找解码器的方法。

然后,就是打开操作了,avcodec_open2 就是打开解码器的操作,比较容易理解。

Start、Stop 函数
int DecodeThread::Start(){
    mythread = new thread(&Run, this);
    if(!mythread){
        return -1;
    }
    return 0;
}

int DecodeThread::Stop(){
    Thread::Stop();
}

这段代码不长,比较好理解。

Start 函数就是 new 了一个线程,Stop 函数就是调用了父类 Thread 的 Stop,作用就是终止线程和释放资源。

好了,我们还剩下一个函数 Run,这比较多,我们下一篇文章再讲。

欲知后事如何,请听下回分解。

猜你喜欢

转载自blog.csdn.net/weixin_60701731/article/details/134439603