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

介绍

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

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

解析

上篇文章,我们解析了 audiooutput 的一部分,我们接下来继续解析函数,Init,DeInit,fill_audio_pcm。

我们先看 Init

cpp 复制代码
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,这个包含音频输出格式的结构体

cpp 复制代码
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,恢复音频。

好了,今天就先到这里,明天讲的函数很重要,因为比较多而且设计的音频数据的播放。

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

相关推荐
程序员老陆10 小时前
M3U8(HLS 索引协议)深度详解:它不存一帧画面,却指挥了整个互联网视频
音视频·hls·m3u8
雪的季节10 小时前
音视频(51-52)
音视频
hz5678911 小时前
视频会议终端品牌如何选择?主流产品特点与选型标准
安全·音视频·实时音视频·信息与通信
程序员老陆11 小时前
说一说FFmpeg6在Linux平台的编译
linux·运维·服务器·ffmpeg
用户5181860056613 小时前
FFmpeg 剪辑:为什么 `-c copy` 往往做不到帧准确剪切
ffmpeg
NutShell Wang13 小时前
国产全模态开源潮:从语言模型到视频模型,中国开源生态再升级
人工智能·语言模型·开源·大模型·音视频·多模态·vibe coding
福大大架构师每日一题14 小时前
mediamtx v1.19.3正式发布:认证安全、WebRTC跨域、MoQ稳定性、RTSP与HLS全面升级
安全·ffmpeg·webrtc
民乐团扒谱机15 小时前
【读论文】复调音乐信号的主旋律提取:方法、应用与挑战
开发语言·人工智能·算法·音视频·音乐
byte轻骑兵15 小时前
【AVDTP】规范精讲[8-3]: 流配置核心三步:从参数下发到动态重配置全拆解
音视频·avrcp·蓝牙耳机·蓝牙车机·蓝牙音频控制
微帧Visionular18 小时前
GenOpt像素智绘引擎|AI生成视频需要怎样的视觉优化算法?
人工智能·aigc·音视频