1、基本流程
#include<iostream> using namespace std; //用到的C的头文件 extern "C" { #include<libavcodec/avcodec.h> #include<libavformat/avformat.h> #include<libavutil/avutil.h> #include<libswresample/swresample.h> } //对用到的预编译 #pragma comment(lib, "avformat.lib") #pragma comment(lib, "avcodec.lib") #pragma comment(lib, "avutil.lib") #pragma comment(lib, "swresample.lib") int main() { //注册 av_register_all(); avcodec_register_all(); //定义文件 char inputFile[] = "audio.pcm"; char outputFile[] = "audio.aac"; int ret = 0; //找到aac编码器 AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_AAC); if (!codec) { cout << "avcodec_find_encoder faild" << endl; return -1; } //配置编码器上下文 AVCodecContext* ac = avcodec_alloc_context3(codec); if (!ac) { cout << "avcodec_alloc_context3 faild" << endl; return -1; } //给编码器设置参数 ac->sample_rate = 44100; //采样率 ac->channels = 2; //声道数 ac->channel_layout = AV_CH_LAYOUT_STEREO; //立体声 ac->sample_fmt = AV_SAMPLE_FMT_FLTP; //采样格式为32位float即样本类型fltp ac->bit_rate = 64000; //比特率,采样率。 //给音频的帧设置同一个头部 ac->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; //打开音频编码器 ret = avcodec_open2(ac, codec, NULL); if (ret < 0) { cout << "avcodec_open2 faild" << endl; return -1; } //创建一个输出的上下文, 初始化oc AVFormatContext *oc = NULL; avformat_alloc_output_context2(&oc, NULL, NULL, outputFile); if (!oc) { cout << " avformat_alloc_output_context2 faild" << endl; return -1; } //设置音频流 AVStream* st = avformat_new_stream(oc, NULL); st->codecpar->codec_tag = 0; avcodec_parameters_from_context(st->codecpar,ac); //把ac参数拷贝过来 //类似于print,打印视频或者音频信息,参数分别为输出上下文,音视频(0,1),输出文件名,是否输出 av_dump_format(oc, 0,outputFile, 1); //打开文件流 ret = avio_open(&oc->pb, outputFile, AVIO_FLAG_WRITE); if (ret < 0) { cout << "avio_open faild" << endl; return -1; } //打开文件IO流 avio_close(oc->pb); //关闭编码器 avcodec_close(ac); avcodec_free_context(&ac); avformat_free_context(oc); return 0; }
FFMpeg音频混合,背景音(二):pcm压缩为aac整体流程
原文:https://www.cnblogs.com/zhangxianrong/p/13815003.html