上一篇文章,是分离视频文件里的mp3音频码流,分离出来后是可以直接播放的。但是对于aac编码的音频,直接分离aac码流是不一定能播放的。如果视频复用格式是TS,则直接存储AVPacket的data是可以播放的。如果是mp4/flv/mkv等格式则不行,因为调用av_read_frame()后得到的AVPacket里面的内容是AAC纯数据,就是那种不包含ADTS文件头的AAC数据。
本以为仿照分离h264的方法,用 “aac_adtstoasc” bitstream filter会起作用,没想到还是不能播放,官方文档对aac_adtstoasc的解释:
aac_adtstoasc只是把带ADTS头的AAC流封装进MOV/MP4等格式时,创建MPEG-4 AudioSpecificConfig(asc),并去掉ADTS header。并没有相反的过程。所以只能手动添加7字节的ADTS头。
下面代码输入是一个ts格式的视频,分离aac数据,直接可播放。
void demux_ts(void)
{
const char *src_filename = "/Users/zhw/Desktop/resource/sintel_h264_aac.ts";
const char *audio_dst_filename = "/Users/zhw/Desktop/sintel.aac";
int audio_index;
AVFormatContext *i