为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Android

课程名称音视频基础+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数据了。
图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
移动开发工程师
手记
粉丝
11
获赞与收藏
16

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消