首页 > 其他 > 详细

FFMpeg音频混合,背景音(二):pcm压缩为aac整体流程

时间:2020-10-14 19:06:16      阅读:35      评论:0      收藏:0      [点我收藏+]

一、整体流程代码

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!