18.FFmpeg学习笔记 - 编码音频

本文详细记录了使用FFmpeg将两个f32le格式的单声道PCM音频文件编码为AAC的过程。由于AAC格式要求fltp的pcm数据,因此左声道和右声道分别被存入AVFrame的data[0]和data[1]。同时,编码后的AAC数据还需添加ADTS头以确保可播放。
摘要由CSDN通过智能技术生成

本篇文章要把pcm原始音频数据编码为AAC格式的音频数据。由于aac格式只支持fltp格式的pcm数据,也就是float planar格式,所以,打算输入两个pcm原始音频文件,一个是左声道,一个是右声道,两文件都是f32le、单声道、采样率48000的音频文件。这样读入两个文件的内容,分别放入AVFrame的data[0]和data[1]当中。

编码为AAC格式,还要加入ADTS头,才能播放。

#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
#include <libavutil/samplefmt.h>
#include <libavutil/timestamp.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) {
        if (*p == sample_fmt)
            return 1;
        p++;
    }
    return 0;
}

int find_sample_index(int samplerate)
{
    int adts_sample_rates[] = {96000,882000,64000,48000,441000,32000,24000,22050,16000,12000,11025,8000,7350,0,0,0};
    int i;
    for(i=0; i < 16;i++)
    {
        if(samplerate == adts_sample_rates[i])
            return i;
    }
    return 16 - 1;
}


static void encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt,
                   FILE *output)
{
    int ret;
    
    /* send the frame for encoding 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值