/**
* @projectName 08-01-encode_audio
* @brief 音频编码
* 从本地读取PCM数据进行AAC编码
* 1. 输入PCM格式问题,通过AVCodec的sample_fmts参数获取具体的格式支持
* (1)默认的aac编码器输入的PCM格式为:AV_SAMPLE_FMT_FLTP
* (2)libfdk_aac编码器输入的PCM格式为AV_SAMPLE_FMT_S16.
* 2. 支持的采样率,通过AVCodec的supported_samplerates可以获取
* @author Liao Qingfu
* @date 2020-04-15
*/
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#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);
re
FFmpeg音频编码 ---- pcm转aac(使用新版ffmpeg API,亲测可用)
本文详细介绍了如何使用最新版的FFmpeg库API将PCM音频数据转换为AAC编码,提供了亲测有效的步骤和代码示例,适用于音频处理和多媒体开发领域的实践操作。
摘要由CSDN通过智能技术生成