ffmpeg简易播放器的实现-音频播放

 作者:leisure

本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10068490.html


基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文件解码和调用SDL显示两大部分。详细流程可参考代码注释。
本篇实验笔记主要参考如下两篇文章:
[1]. 最简单的基于FFMPEG+SDL的视频播放器ver2(采用SDL2.0)
[2]. An ffmpeg and SDL Tutorial

1. 视频播放器基本原理

下图引用自“雷霄骅,视音频编解码技术零基础学习方法”,因原图太小,看不太清楚,故重新制作了一张图片。
播放器基本原理示意图
如下内容引用自“

2.3 关键函数

几个关键函数的说明直接写在代码注释里:

2.3.1 开启音频处理子线程

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // 打开音频设备并创建音频处理线程。期望的参数是wanted_spec,实际得到的硬件参数是actual_spec // 1) SDL提供两种使音频设备取得音频数据方法: //    a. push,SDL以特定的频率调用回调函数,在回调函数中取得音频数据 //    b. pull,用户程序以特定的频率调用SDL_QueueAudio(),向音频设备提供数据。此种情况wanted_spec.callback=NULL // 2) 音频设备打开后播放静音,不启动回调,调用SDL_PauseAudio(0)后启动回调,开始正常播放音频 SDL_AudioSpec wanted_spec; SDL_AudioSpec actual_spec; wanted_spec.freq = p_codec_ctx->sample_rate;    // 采样率 wanted_spec.format = AUDIO_S16SYS;              // S表带符号,16是采样深度,SYS表采用系统字节序 wanted_spec.channels = p_codec_ctx->channels;   // 声音通道数 wanted_spec.silence = 0;                        // 静音值 wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE;    // SDL声音缓冲区尺寸,单位是单声道采样点尺寸x通道数 wanted_spec.callback = audio_callback;          // 回调函数,若为NULL,则应使用SDL_QueueAudio()机制 wanted_spec.userdata = p_codec_ctx;             // 提供给回调函数的参数 SDL_OpenAudio(&wanted_spec, &actual_spec);

2.3.2 启动音频回调机制

1 2 3 4 5 // 暂停/继续音频回调处理。参数1表暂停,0表继续。 // 打开音频设备后默认未启动回调处理,通过调用SDL_PauseAudio(0)来启动回调处理。 // 这样就可以在打开音频设备后先为回调函数安全初始化数据,一切就绪后再启动音频回调。 // 在暂停期间,会将静音值往音频设备写。 SDL_PauseAudio(0);

2.3.3 音频回调函数

用户实现的函数,由SDL音频处理子线程回调

1 2 3 4 5 6 7 8 9 10 11 // 音频处理回调函数。读队列获取音频包,解码,播放 // 此函数被SDL按需调用,此函数不在用户主线程中,因此数据需要保护 // \param[in]  userdata用户在注册回调函数时指定的参数 // \param[out] stream 音频数据缓冲区地址,将解码后的音频数据填入此缓冲区 // \param[out] len    音频数据缓冲区大小,单位字节 // 回调函数返回后,stream指向的音频缓冲区将变为无效 // 双声道采样点的顺序为LRLRLR void audio_callback(void *userdata, uint8_t *stream, int len) {     ... }

关键字:

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信