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;
}