使用FFMPEG库将PCM编码为AAC

本文介绍了如何使用FFmpeg库将48000Hz 2 channel f32le格式的PCM数据编码为AAC。内容涉及PCM数据的提取、播放、编码流程以及编码过程中的采样率、比特率的影响。还提供了PCM文件和AAC文件大小的计算方法,并给出了源码和工程下载链接。
摘要由CSDN通过智能技术生成

准备

ffmpeg 版本4.4

准备一段48000Hz 2 channel f32le 格式的PCM原始数据

这里我们直接使用ffmpeg命令行提取

ffmpeg -i beautlWorld.mp4 -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm

-ar 采样率

-ac 音频通道

-f f32le 音频样本数据存储格式(f32 ---- float 32位 le ----小端)

使用下面命令进行播放:

ffplay -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm

编码流程

基本上面的流程已经很清晰了,按照步骤编写代码即可,下面贴出源码

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
 
extern "C" {
    #include <libavcodec/avcodec.h>
 
    #include <libavutil/channel_layout.h>
    #include <libavutil/common.h>
    #include <libavutil/frame.h>
    #include <libavutil/samplefmt.h>
    #include <libavutil/opt.h>
}
 
/* 检测该编码器是否支持该采样格式 */
static int check_sample_fmt(const AVCodec* codec, enum AVSampleFormat sample_fmt)
{
    const enum  AVSampleFormat* p = codec->sample_fmts;
 
    while (*p != AV_SAMPLE_FMT_NONE) { // 通过AV_SAMPLE_FMT_NONE作为结束符
 
        if (*p == sample_fmt)
            return 1;
        p++;
    }
    return 0;
}
 
/* 检测该编码器是否支持该采样率 */
static int check_sample_rate(const AVCodec* codec, const int sample_rate)
{
    const int* p = codec->supported_samplerates;
    while (*p != 0) {// 0作为退出条件,比如libfdk-aacenc.c的aac_sample_rates
        printf("%s support %dhz\n", codec->name, *p);
        if (*p == sample_rate)
            return 1;
        p++;
    }
    return 0;
}
 
/* 检测该编码器是否支持该采样率, 该函数只是作参考 */
static int check_channel_layout(const AVCodec* codec, const uint64_t channel_layout)
{
    // 不是每个codec都给出支持的channel_layout
    const uint64_t* p = codec->channel_layouts;
    if (!p) {
        printf("the codec %s no set channel_layouts\n", codec->name);
        return 1;
    }
    while (*p != 0) { // 0作为退出条件,比如libfdk-aacenc.c的aac_channel_layout
        printf("%s support channel_layout %d\n", codec->name, *p);
        if (*p == channel_layout)
            return 1;
        p++;
    }
    return 0;
}
 
static int check_codec(AVCodec* codec, AVCodecContext* codec_ctx)
{
 
    if (!check_sample_fmt(codec, codec_ctx->sample_fmt)) {
        fprintf(stderr, "Encoder does not support sample format %s",
            av_get_sample_fmt_name(codec_ctx->sample_fmt));
        return 0;
    }
    if (!check_sample_rate(codec, codec_ctx->sample_rate)) {
        fprintf(stderr, "Encoder does not support sample rate %d", codec_ctx->sample_rate);
        return 0;
    }
    if (!check_channel_layout(codec, codec_ctx->channel_layout)) {
        fprintf(stderr, "Encoder does not support channel layout %lu", codec_ctx->cha
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值