播放器二(FFMPEG+SDL+AUDIO)

本文介绍了使用FFMPEG和SDL实现音频播放器的流程,包括音频解码、重采样、编码以及SDL的音频处理。通过avformat_open_input()打开音频文件,avcodec_find_decoder()找到解码器,avcodec_decode_audio4()解码,再利用SDL的SDL_OpenAudio()打开声音设备,并设置回调函数进行播放。核心转换函数和SDL回调在fill_audio()中完成混播操作。
摘要由CSDN通过智能技术生成


AUDIO大致流程:

//初始化输入
avformat_open_input()           -- 打开对应音频文件
avformat_find_stream_info()     -- 从输入文件中获取到流的相关信息,例如:文件中流的数量

//初始化解码器
avcodec_find_decoder()          -- 根据ffmpeg提供的解码器id,找到对应的解码器
avcodec_open2()                     -- 打开解码器

//初始化输出
avformat_alloc_context()        -- 创建输出信息上下文
avcodec_find_encoder()          -- 找到编码器
avcodec_alloc_context3()            -- 根据编码器,初始化编码上下文
avcodec_open2()                 -- 打开编码器

//初始化一个FIFO(先进先出)
av_audio_fifo_alloc()           -- 初始化一个先进先出的缓存,用了存储解码后的pcm数据

//初始化音频重采用器
swr_alloc_set_opts()            -- 设置转化器参数
swr_init()                      -- 初始化转换器

//开始音频转换

while(finished) {
// 解码
av_read_frame()                     -- 读取要进行转码的数据
avcodec_decode_audio4()         -- 进行解码
av_samples_alloc()              -- 创建样本空间
swr_convert()                       -- 数据重采样
av_audio_fifo_write()           -- 将数据存储到fifo缓存中

// 编码
av_audio_fifo_read()            -- 从fifo缓存中读取pcm数据
avcodec_encode_audio2()         -- 将数据进行编码

}

1、SDL

现在我们要来播放声音。SDL 也为我们准备了输出声音的方法。函数 SDL_OpenAudio()本身就是用
来打开声音设备的。它使用一个叫做 SDL_AudioSpec 结构体作为参数,这个结构体中包含了我们将要输
出的音频的所有信息。
在我们展示如何建立之前,让我们先解释一下电脑是如何处理音频的。数字音频是由一长串的样本流
组成的。每个样本表示声音波形中的一个值。声音按照一个特定 的采样率来进行录制,采样率表示以多
快的速度来播放这段样本流,它的表示方式为每秒多少次采样。例如 22050 和 44100 的采样率就是电台
和 CD 常用的 采样率。此外,大多音频有不只一个通道来表示立体声或者环绕。例如,如果采样是立体
声,那么每次的采样数就为 2 个。当我们从一个电影文件中等到数据的时 候,我们不知道我们将得到多
少个样本,但是 ffmpeg 将不会给我们部分的样本――这意味着它将不会把立体声分割开来。
SDL 播放声音的方式是这样的:你先设置声音的选项:采样率(在 SDL 的结构体中被叫做 freq 的表
示频率 frequency),声音通道数和其它的参 数,然后我们设置一个回调函数和一些用户数据 userdata。
当开始播放音频的时候,SDL 将不断地调用这个回调函数并且要求它来向声音缓冲填入一个特 定的数量
的字节。当我们把这些信息放到 SDL_AudioSpec 结构体中后,我们调用函数 SDL_OpenAudio()就会打开
声音设备并且给我们送 回另外一个 AudioSpec 结构体。这个结构体是我们实际上用到的--因为我们不
能保证得到我们所要求的

2、核心转换函数

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值