1、使用avformat_open_input函数打开音视频文件
2、使用avformat_find_stream_info函数获取解码器信息。
3、使用av_dump_format设置打印信息
4、使用av_init_packet初始化AVPacket。
5、使用av_find_best_stream查找对应音视频流的流下标。
6、使用av_read_frame读取音视频帧,判断AVPacket的stream_index是否等于音频下标。
7、如果是音频帧,则先写AAC存储格式ADTS头,然后写音频帧数据。
8、调用avformat_close_input关闭输入文件。
ADTS头部:
int adts_header(char * const p_adts_header, const int data_length,
const int profile, const int samplerate,
const int channels)
{
int sampling_frequency_index = 3;
int adtsLen = data_length + 7;
int frequencies_size = sizeof(sampling_frequencies) / sizeof(sampling_frequencies[0]);
int i = 0;
for(i = 0; i < frequencies_size; i++)
{
if(sampling_frequencies[i] == samplerate)
{
sampling_frequency_index = i;
break;
}
}
if(i >= frequencies_size)
{
printf("unsupport samplerate:%d\n", samplerate);
return -1;
}
p_adts_header[0] = 0xff;
p_adts_header[1] = 0xf0;
p_adts_header[1] |= (0 << 3);
p_adts_header[1] |= (0 << 1);
p_adts_header[1] |= 1;
p_adts_header[2] = (profile)<<6;
p_adts_header[2] |= (sampling_frequency_index & 0x0f)<<2;
p_adts_header[2] |= (0 << 1);
p_adts_header[2] |= (channels & 0x04)>>2;
p_adts_header[3] = (channels & 0x03)<<6;
p_adts_header[3] |= (0 << 5);
p_adts_header[3] |= (0 << 4);
p_adts_header[3] |= (0 << 3);
p_adts_header[3] |= (0 << 2);
p_adts_header[3] |= ((adtsLen & 0x1800) >> 11);
p_adts_header[4] = (uint8_t)((adtsLen & 0x7f8) >> 3);
p_adts_header[5] = (uint8_t)((adtsLen & 0x7) << 5);
p_adts_header[5] |= 0x1f;
p_adts_header[6] = 0xfc;
return 0;
}