FFMPEG操作流数据-获取aac音频文件

本文详细介绍了如何使用ffmpeg库从视频文件中提取AAC音频,包括初始化、打开文件、查找音频流、读取数据包、写入ADTS头、关闭文件等步骤。通过示例代码,演示了从MP4文件中导出AAC音频到单独的AAC文件,并验证了播放的正确性。此外,还提供了使用ffmpeg命令行工具快速转换音频的选项。
摘要由CSDN通过智能技术生成

多媒体文件是一个容器,在容器里有很多的流(Stream/Track【翻译:轨】),如视频流、音频流、字幕流等。

常见操作

解复用
获取流(AVStream)
读数据包(AVPacket)
解码/编码(Decoder/Encoder)
渲染(Render)
释放资源

常用结构体

  • AVFormatContext 格式上下文,保存这一路流的相关信息,如时间戳、解码器等
  • AVStream 流相关
  • AVPacket 包相关

提取视频文件里的aac音频步骤

初始化
  • av_register_all(); //该接口是使用ffmpeg的必调接口,用于注册支持的编解码器
  • av_log_set_level(AV_LOG_INFO);//设置日志打印级别,该级别会影响打印结果
打开一个视频文件
  • int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);
    – 参数ps表示作为出参,函数调用成功会得到AVFormatContext指针类型的数据对象,存储视频文件的上下文信息。
    – url表示即将打开的文件的路径。
    – 后面两个参数在使用时填NULL即可。
打印视频文件流信息
  • void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output);
    – ic变量传入通过avformat_open_input接口得到的上下文结构指针。
    – index表示需打印流信息的索引。
    – url为文件地址。
    – is_output表示传入的context是一个input还是output。
查找音视频流对应的索引号
  • int av_find_best_stream(AVFormatContext *ic,
    enum AVMediaType type,
    int wanted_stream_nb,
    int related_stream,
    AVCodec **decoder_ret,
    int flags);
    – type表示查找的数据类型,此次为查找音频,可对应于AVMEDIA_TYPE_AUDIO 。
    – wanted_stream和related_stream直接填-1,表示不用关心参数。
    – decoder_ret可返回找到的流使用的解码器,此处不需关心,填NULL。
    – 调用成功后返回值为得到的索引号。
循环读数据
  • void av_init_packet(AVPacket *pkt);//使用默认值初始化AVPacket结构变量各成员
  • int av_read_frame(AVFormatContext *s, AVPacket *pkt); //每次读一包数据,数据内容存储在pkt变量里:
    – 其中比较关键的是pkt变量里会存储当前pkt的流索引,可以根据此索引和av_find_best_stream得到的索引进行比较,确认数据是音频流还是视频流。
    – pkt的data和size成员分别存储着流数据的数据内容和数据长度。
  • void av_packet_unref(AVPacket *pkt);//对pkt进行解引用,将一些成员设为默认值
循环写数据
  • 在写入实际aac数据之前需要在写入每一个pkt.data之前写入adts头,其中添加adts头的代码如下:
#define ADTS_HEAD_LEN 7
void adts_header(char* szAdtsHeader, int dataLen)
{
   
    int audio_object_type = 2;          //AAC(Main)
    int sampling_frequency_index = 3;   //48000hz
    int channel_config = 2;             //通道数
    int adtsLen = dataLen + ADTS_HEAD_LEN;

    szAdtsHeader[0] = 0xff;                                     //syncword:0xfff,其中高8位
    
    szAdtsHeader[1] = 0xf0;                                     //syncword:0xfff,其中低4位
    szAdtsHeader[1] |= (0 << 3);                                //MPEG Version:0 for MPEG-4;1 for MPEG-2;占1位
    szAdtsHeader[1] |= (0 << 1);                                //Layer:0,占2位
    szAdtsHeader[1] |= 1;                                       //protection absent:1, 占1位

    szAdtsHeader[2] = (audio_object_type - 1) << 6;             //profile:audio_object_type -1;占2位
    szAdtsHeader[2] = (sampling_frequency_index & 0x0f) << 2;   //sampling frequency index:sample_frequency_index;占4位
    szAdtsHeader[2] |= (0 << 1);                                //private bit:0;占1位
    szAdtsHeader[2] 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值