请选择 进入手机版 | 继续访问电脑版

ffmpeg-从flv文件中提取AAC音频数据保存为文件

[复制链接]
小浣熊 发表于 2021-1-2 11:44:10 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
AAC ADTS格式协议:
从flv文件中提取AAC音频数据生存为文件。
如果需要详细相识AAC ADTS格式,可以查询文档。
原文件:

提取aac文件:

main.c
  1. #include #include >#include #include #define        ADTS_HEADER_LEN      7;const int sampling_frequencies[] ={    96000, //0x0    88200, //0x1    64000, //0x2    48000, //0x3    44100, //0x4    32000, //0x5    24000, //0x6    22050, //0x7    16000, //0x8    12000,  // 0x9    11025,  // 0xa    8000   // 0xb    // 0xc d e f是生存的};int adts_header(char* const p_adts_header, const int data_length,                const int profile, const int samplerate, const int channels){    int sampling_frequencies_index = 3; //默认使用48000    int adtsLen = data_length + 7;    //根据输入文件的samplerate 获取 相应的在ADTS中设置的索引    int frequencies_size = sizeof(sampling_frequencies) / sizeof(sampling_frequencies[0]);    int i = 0;    for(i = 0; i < frequencies_size; i++)    {        if(samplerate == sampling_frequencies[i])        {            sampling_frequencies_index = i;            break;        }    }    if(sampling_frequencies_index >= frequencies_size)    {        printf("unsupport samplerate:%d\n", samplerate);        return -1;    }    //同步头 总是0xFFF(12个bit),代表着一个ADTS帧的开始    p_adts_header[0] = 0xff;    p_adts_header[1] = 0xf0;    //MPEG标识符,0标识MPEG-4,1标识MPEG-2(1个bit)    p_adts_header[1] |= (0 codec_id != AV_CODEC_ID_AAC)    {        printf("the media file no contain AAC stream, it&#39;s codec_id is %d\n",               ifmat_ctc->streams[audio_index]->codecpar->codec_id);        goto END;    }    //读取媒体文件,并把aac数据帧写入当地文件    while (av_read_frame(ifmat_ctc, &pkt) >=0 )    {        if(pkt.stream_index == audio_index)        {            char adts_header_buf[7] = {0};            //获取ADTS帧头信息            adts_header(adts_header_buf, pkt.size,                        ifmat_ctc->streams[audio_index]->codecpar->profile,                        ifmat_ctc->streams[audio_index]->codecpar->sample_rate,                        ifmat_ctc->streams[audio_index]->codecpar->channels);            //写入adts header,ts流不适用,ts流分离出来的packet带了adts header           fwrite(adts_header_buf, 1, 7, aac_fd);           len = fwrite(pkt.data, 1, pkt.size, aac_fd);//写入adts data            if(len != pkt.size)            {                av_log(NULL, AV_LOG_DEBUG, "warning, length of writed data isn&#39;t equal pkt.size(%d, %d)\n",                       len,                       pkt.size);            }        }        av_packet_unref(&pkt);    }END:    if(ifmat_ctc)        avformat_close_input(&ifmat_ctc);    if(aac_fd)        fclose(aac_fd);    return 0;}
复制代码
来源:https://blog.csdn.net/m0_37599645/article/details/112007245
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )