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、核心转换函数