介绍
在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器
如果您不理解本文,可参考我的前一篇文章音视频项目---基于FFmpeg和SDL的音视频播放器解析(四)
解析
接着上文,我们继续解析上次没讲完的四个函数,AudioCodecParameters,VideoCodecParameters,AudioStreamTimebase,VideoStreamTimebase。
cpp
AVCodecParameters* DemuxThread::AudioCodecParameters(){
if(audio_index != -1){
return ifmt_ctx->streams[audio_index]->codecpar;
}else{
return nullptr;
}
}
AVCodecParameters* DemuxThread::VideoCodecParameters(){
if(video_index != -1){
return ifmt_ctx->streams[video_index]->codecpar;
}else{
return nullptr;
}
}
AVRational DemuxThread::AudioStreamTimebase(){
if(audio_index != -1){
return ifmt_ctx->streams[audio_index]->time_base;
}else{
return AVRational{0, 0};
}
}
AVRational DemuxThread::VideoStreamTimebase(){
if(video_index != -1){
return ifmt_ctx->streams[video_index]->time_base;
}else{
return AVRational{0, 0};
}
}
因为 video 和 audio 同理,因此我们就只讲 video 的例子,audio 同样理解就行。
我们首先将 AVCodecParameters,如果视频的 index 存在,就是不等于 -1 的时候,返回当前流中的 codecpar,即为 AVCodecParameters。这是用于保存音视频流的基本参数信息的结构体,想了解细节可看ffmpeg之AVCodecParameters结构体详细解释
接着,我们讲 AVRational,同理,如果当前的 index 存在时,则返回 time-base。
AVRational 的结构体如下
cpp
typedef struct AVRational {
int num; ///< Numerator (分子)
int den; ///< Denominator (分母)
} AVRational;
主要用于时间戳和帧率的计算,例如,对于一个帧率为 25fps 的视频来说,其 AVRational 可以表示为 {25, 1}。
好了,demuxthread 我们就解析完了,下一篇文章我们会讲负责解码的线程 decodethread。
欲知后事如何,请听下回分解。