`

最简单的基于FFMPEG的音频编码器(PCM编码为AAC)

 
阅读更多

本文介绍一个最简单的基于FFMPEG的音频编码器。该编码器实现了PCM音频采样数据编码为AAC的压缩编码数据。编码器代码十分简单,但是每一行代码都很重要。通过看本编码器的源代码,可以了解FFMPEG音频编码的流程。

本程序使用最新版的类库(编译时间为2014.5.6),开发平台为VC2010。所有的配置都已经做好,只需要运行就可以了。

下面直接上代码:

 

/* 
 *最简单的基于FFmpeg的音频编码器
 *Simplest FFmpeg Audio Encoder
 *
 *雷霄骅 Lei Xiaohua
 *leixiaohua1020@126.com
 *中国传媒大学/数字电视技术
 *Communication University of China / Digital TV Technology
 *http://blog.csdn.net/leixiaohua1020
 *
 *本程序实现了音频PCM采样数据编码为压缩码流(MP3,WMA,AAC等)。
 *是最简单的FFmpeg音频编码方面的教程。
 *通过学习本例子可以了解FFmpeg的编码流程。
 *This software encode PCM data to AAC bitstream.
 *It's the simplest audio encoding software based on FFmpeg. 
 *Suitable for beginner of FFmpeg 
 */

#include "stdafx.h"

extern "C"
{
#include "libavcodec\avcodec.h"
#include "libavformat\avformat.h"
#include "libswscale\swscale.h"
};

int _tmain(int argc, _TCHAR* argv[])
{
	AVFormatContext* pFormatCtx;
	AVOutputFormat* fmt;
	AVStream* audio_st;
	AVCodecContext* pCodecCtx;
	AVCodec* pCodec;

	uint8_t* frame_buf;
	AVFrame* frame;
	int size;

	FILE *in_file = fopen("tdjm.pcm", "rb");	//音频PCM采样数据 
	int framenum=1000;	//音频帧数
	const char* out_file = "tdjm.aac";		//输出文件路径


	av_register_all();

	//方法1.组合使用几个函数
	pFormatCtx = avformat_alloc_context();
	//猜格式
	fmt = av_guess_format(NULL, out_file, NULL);
	pFormatCtx->oformat = fmt;


	//方法2.更加自动化一些
	//avformat_alloc_output_context2(&pFormatCtx, NULL, NULL, out_file);
	//fmt = pFormatCtx->oformat;

	//注意输出路径
	if (avio_open(&pFormatCtx->pb,out_file, AVIO_FLAG_READ_WRITE) < 0)
	{
		printf("输出文件打开失败!\n");
		return -1;
	}

	audio_st = av_new_stream(pFormatCtx, 0);
	if (audio_st==NULL){
		return -1;
	}
	pCodecCtx = audio_st->codec;
	pCodecCtx->codec_id = fmt->audio_codec;
	pCodecCtx->codec_type = AVMEDIA_TYPE_AUDIO;
	pCodecCtx->sample_fmt = AV_SAMPLE_FMT_S16;
	pCodecCtx->sample_rate= 44100;
	pCodecCtx->channel_layout=AV_CH_LAYOUT_STEREO;
	pCodecCtx->channels = av_get_channel_layout_nb_channels(pCodecCtx->channel_layout);
	pCodecCtx->bit_rate = 64000;  

	//输出格式信息
	av_dump_format(pFormatCtx, 0, out_file, 1);

	pCodec = avcodec_find_encoder(pCodecCtx->codec_id);
	if (!pCodec)
	{
		printf("没有找到合适的编码器!\n");
		return -1;
	}
	if (avcodec_open2(pCodecCtx, pCodec,NULL) < 0)
	{
		printf("编码器打开失败!\n");
		return -1;
	}
	frame = avcodec_alloc_frame();
	frame->nb_samples= pCodecCtx->frame_size;
	frame->format= pCodecCtx->sample_fmt;
	
	size = av_samples_get_buffer_size(NULL, pCodecCtx->channels,pCodecCtx->frame_size,pCodecCtx->sample_fmt, 1);
	frame_buf = (uint8_t *)av_malloc(size);
	avcodec_fill_audio_frame(frame, pCodecCtx->channels, pCodecCtx->sample_fmt,(const uint8_t*)frame_buf, size, 1);
	
	//写文件头
	avformat_write_header(pFormatCtx,NULL);

	AVPacket pkt;
	av_new_packet(&pkt,size);

	for (int i=0; i<framenum; i++){
		//读入PCM
		if (fread(frame_buf, 1, size, in_file) < 0)
		{
			printf("文件读取错误!\n");
			return -1;
		}else if(feof(in_file)){
			break;
		}
		frame->data[0] = frame_buf;  //采样信号

		frame->pts=i*100;
		int got_frame=0;
		//编码
		int ret = avcodec_encode_audio2(pCodecCtx, &pkt,frame, &got_frame);
		if(ret < 0)
		{
			printf("编码错误!\n");
			return -1;
		}
		if (got_frame==1)
		{
			printf("编码成功第%d帧!\n",i);
			pkt.stream_index = audio_st->index;
			ret = av_write_frame(pFormatCtx, &pkt);
			av_free_packet(&pkt);
		}
	}
	
	//写文件尾
	av_write_trailer(pFormatCtx);

	//清理
	if (audio_st)
	{
		avcodec_close(audio_st->codec);
		av_free(frame);
		av_free(frame_buf);
	}
	avio_close(pFormatCtx->pb);
	avformat_free_context(pFormatCtx);

	fclose(in_file);

	return 0;
}

 

 

 

工程下载地址:

http://download.csdn.net/detail/leixiaohua1020/7324091

SourceForge项目地址:

https://sourceforge.net/projects/simplestffmpegaudioencoder/

分享到:
评论

相关推荐

    最简单的基于FFMPEG的音频编码器

    该图像编码器实现了音频PCM采样数据编码为AAC码流。 尽管该音频编码器的代码十分简单,但是几乎包含了使用FFMPEG编码一个音频所有必备的API。十分适合FFmpeg的初学者。 工程基于VC2010。 使用了2014.5.6版本的...

    FFMPEG实现PCM编码AAC和MP3(采用封装格式实现)

    在FFmpeg中,使用`-c:a aac`参数指定AAC编码器,通过`-b:a 64k`设置比特率为64kbps,确保音频质量和文件大小的平衡。 3. **MP3编码**:MPEG Audio Layer III(MP3)是一种广泛使用的音频压缩格式,尽管它的压缩效率...

    simplest_ffmpeg_audio_encoder--最简单的基于FFMPEG的音频编码器(PCM编码为AAC)

    6. **编码音频帧(AVFrame)**:将PCM数据转换为`AVFrame`,然后使用`avcodec_send_frame()`函数将音频帧发送到编码器。编码器会处理这些帧并返回编码后的数据。 7. **接收编码后的数据**:调用`avcodec_receive_...

    最简单的基于FFMPEG的音频编码器 1.1

    该音频编码器实现了音频PCM采样数据编码为AAC码流。 尽管该音频编码器的代码十分简单,但是几乎包含了使用FFMPEG编码一个音频所有必备的API。十分适合FFmpeg的初学者。 1.1版本增加了多平台下编译的支持:Windows,...

    文库首页后端C++最简单的基于FFMPEG的音频编码器 1.1最简单的基于FFMPEG的音频编码器 1.1

    在C++中使用FFmpeg可以实现音频编码器,本文将详细介绍如何构建一个最简单的基于FFMPEG的音频编码器。 FFmpeg 包含了多种音频和视频编解码库,如libavcodec(编解码)、libavformat(容器格式处理)和libavutil...

    基于FFmpeg4.0.2的AAC编码器

    在这个基于FFmpeg4.0.2的AAC编码器项目中,开发者在Windows 10 64位环境下,成功地创建了一个程序,能够利用FFmpeg的新版本将PCM( Pulse Code Modulation,脉冲编码调制)音频数据编码为AAC(Advanced Audio Coding...

    ffmpeg之pcm转AAC

    总之,FFmpeg提供了一个简单而强大的接口,用于将PCM音频转换为AAC格式。无论是简单的命令行操作还是深入的编程集成,FFmpeg都是处理音频和视频任务的理想工具。了解和掌握FFmpeg的使用,将极大地提升你在多媒体处理...

    FFmpeg将PCM转为AAC音频.rar

    在这里,`-i`指定输入文件,`-c:a aac`指定了音频编码器为AAC,`output.aac`是输出文件名。 4. 设置参数:如果需要自定义AAC编码参数,可以添加额外选项。例如,调整比特率(`-b:a`)、质量(`-qscale:a`)或使用...

    ffmpeg解码音频并保存PCM的简单demo

    这里,`-i`参数指定输入音频文件,`-f`指定输出格式,`s16le`表示小端16位PCM格式,`-acodec`指定音频编码器,`pcm_s16le`是对应的PCM编码,`output_pcm_file`是输出的PCM文件名。 在这个“TestSavePCM”示例中,...

    44.1Khz或48Khz两通道使用CoreAudio采集音频ffmpeg编码AAC的demo

    本示例"44.1KHz或48KHz两通道使用CoreAudio采集音频ffmpeg编码AAC的demo"聚焦于利用苹果的CoreAudio框架捕获声音数据,并通过FFmpeg进行音频编码,将原始的PCM(脉冲编码调制)数据转换为高效的AAC(高级音频编码)...

    FFmpeg音频编码实例

    - **选择编码器**:FFmpeg支持多种音频编码器,通过`avcodec_find_encoder()`函数可以根据编码器名称找到合适的编码器上下文(`AVCodecContext`)。 - **初始化上下文**:使用`avcodec_open2()`函数打开编码器,...

    读取PCM利用ffmpeg编码音频

    4. **ffmpeg的音频编码选项**:在编码过程中,可以调整各种参数以优化音质或减小文件大小,例如比特率、编码器质量设置等。例如,`-b:a 128k`表示设置音频比特率为128kbps。 5. **处理PCM数据的库函数**:如果你...

    pcm编码aac

    libfdk-aac作为高效的AAC编码器,为音频压缩提供了高质量和高效率的解决方案。通过使用FFmpeg工具,我们可以轻松地将PCM音频转换为AAC,满足不同的应用场景需求,如流媒体服务、移动设备和网络传输。在实际操作中,...

    基于ffmpeg获取rtmp音频并转为16K16BITpcm (c++)

    在本示例中,我们将探讨如何使用C++通过FFmpeg库从RTMP流中提取音频,并将其转换为16KHz、16位的PCM(脉冲编码调制)格式。这个过程对于音频处理、语音识别或者实时通信应用非常常见。 首先,我们需要在项目中集成...

    基于ALSA-FFMPEG实现音频采集与推流功能

    FFmpeg的libavcodec库包含了许多音频编码器,例如AAC、MP3、Opus等。通过调用FFmpeg的API,我们可以选择合适的编码器对原始音频数据进行编码,将其转换成特定格式的数据流。 5. **封装** 将编码后的音频数据封装成...

    音频-麦克风-ffmpeg-aac语音编码VS2010

    这意味着用户可以按照说明,将自己的音频设备名称替换到代码中,以适应不同的硬件环境,实现从麦克风采集音频,经由FFmpeg编码为AAC格式,最后保存到本地文件的功能。 总结起来,这个项目演示了如何利用FFmpeg在VS...

    Android G711(PCMA/PCMU)、G726、PCM音频转码到AAC

    3. **AAC编码**:使用AAC编码器,如FAAC或AAC-LC,将PCM数据编码为AAC流。这通常需要设置编码参数,如比特率、采样率、声道数等,并调用编码API完成编码过程。 4. **编译动态链接库**:将上述C/C++代码打包成.so...

    speex音频转pcm和aac

    此外,描述中还提到了 **Speex 直接转 AAC** 的可能性,这意味着音频数据可以跳过 PCM 阶段,直接从 Speex 编码转换到 AAC 编码,这可能涉及到特定的编解码器实现。 **链表** 在这里可能用于管理音频数据的存储和...

    使用ffmpeg将PCM编码成aac

    这里`-i`参数指定输入文件,`-c:a aac`表示设置音频编码器为AAC,`output.aac`则是输出的AAC文件。 3. **自定义参数**:如果需要调整音频质量、比特率等参数,可以添加更多选项,例如: ``` ffmpeg -i input.pcm...

Global site tag (gtag.js) - Google Analytics