继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【金秋打卡】第20天 创建 AAC 编码器

GT9456
关注TA
已关注
手记 89
粉丝 12
获赞 17

课程名称音视频基础+ffmpeg原理 入门音视频技术开发
课程章节:【实战】音频编码
课程讲师李超

课程内容

ffmpeg编码的过程包括:

  • 创建编码器;
  • 创建上下文;
  • 打开编码器;
  • 送数据给编码器;
  • 编码;
  • 释放资源

ffmpeg 编码过程中重要的 API。

avcodec_find_encoder()      #创建编码器 
avcodec_alloc_context3()    #创建上下文
avcodec_open2()             #打开编码器
avcodec_send_frame()        #将数据送给编码器 
avcodec_receive_packet()    #获取编码后的数据

从查找编码器,分配上下文,设置上下文参数,到打开编码器的完整代码。

AVCodecContext* open_coder(){
    //查找编码器
    int ret;
    char error[1024] = {0, };
    //libfdk_aac音频编码的ID或者名字必须跟 sample_fmt一致才可以,否则ffmpeg会报错。
    AVCodec *codec = avcodec_find_encoder_by_name("libfdk_aac");  
    //创建上下文
    AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);
    codec_ctx->sample_fmt = AV_SAMPLE_FMT_S16;      //输入音频的采样率
    codec_ctx->channel_layout = AV_CH_LAYOUT_STEREO; //输入音频的通道布局
    codec_ctx->channels = 2; //输入音频的通道个数
    codec_ctx->sample_rate = 44100; //输入音频的采样率
    //bitrate 和profile互斥,bit_rate设置为0后,才会查找profile的值
    codec_ctx->bit_rate = 0; //AAC 128K AAC HE 64K AAC HE V2 32K
    codec_ctx->profile = FF_PROFILE_AAC_HE_V2;
    
    //打开编码器
    if((ret = avcodec_open2(codec_ctx, codec, NULL)) < 0){
        av_strerror(ret, error, 1024);
        printf(stderr, "Failed to open audio devices, [%d] %s\n", ret, error);
        return  NULL;
    }
    return codec_ctx;
}

接下来就应该将数据输入编码器,这里有两个结构体,AVFrame,AVPacket。其中AVFrame是没有编码的数据,AVPacket是编码后的数据。所以就是将AVFrame输入编码器进行编码,然后得到AVPacket数据,然后将AVPacket的保存进文件就是AAC数据了。
图片描述

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP