音视频项目—基于FFmpeg和SDL的音视频播放器解析(十四)
介绍
在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器
如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视频播放器解析(十二)
解析
上篇文章,我们解析了 audiooutput 的一部分,我们接下来继续解析函数,Init,DeInit,fill_audio_pcm。
我们先看 Init
int AudioOutput::Init(){
if(SDL_Init(SDL_INIT_AUDIO) != 0){
return -1;
}
SDL_AudioSpec wanted_spec;
SDL_AudioSpec spec;
wanted_spec.channels = 2;
wanted_spec.format = AUDIO_S16SYS;
wanted_spec.silence = 0;
wanted_spec.callback = fill_audio_pcm;
wanted_spec.userdata = this;
wanted_spec.samples = 1024;
int ret = SDL_OpenAudio(&wanted_spec, nullptr);
if(ret != 0){
return -1;
}
dst_tgt.channels = wanted_spec.channels;
dst_tgt.fmt = AV_SAMPLE_FMT_S16;
dst_tgt.freq = wanted_spec.freq;
dst_tgt.channel_layout = av_get_default_channel_layout(2);
dst_tgt.frame_size = 1024;
SDL_PauseAudio(0);
}
这个函数是负责初始化 SDL 播放音频。其中有三个函数比较重要,SDL_Init,SDL_OpenAudio,SDL_PauseAudio。
首先,SDL_Init(SDL_INIT_AUDIO)初始化 SDL 的音频部分。
接着,我们声明了两个 SDL_AudioSpec,这个包含音频输出格式的结构体
typedef struct SDL_AudioSpec
{
int freq; /**< DSP frequency -- samples per second */
SDL_AudioFormat format; /**< Audio data format */
Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */
Uint8 silence; /**< Audio buffer silence value (calculated) */
Uint16 samples; /**< Audio buffer size in samples (power of 2) */
Uint16 padding; /**< Necessary for some compile environments */
Uint32 size; /**< Audio buffer size in bytes (calculated) */
SDL_AudioCallback callback;
void *userdata;
} SDL_AudioSpec;
然后,我们将 wanted_spec 的各项参数进行赋值。
接着,我们通过 SDL_OpenAudio,打开音频设备。
然后,我们给 AVParams 的一个变量 dst_tgt 赋值。
最后,SDL_PuaseAudio,这是负责恢复或者暂停音频的函数,我们在其中传入的参数为 0,恢复音频。
好了,今天就先到这里,明天讲的函数很重要,因为比较多而且设计的音频数据的播放。
欲知后事如何,请听下回分解。