本文介绍一个最简单的基于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/
相关推荐
该图像编码器实现了音频PCM采样数据编码为AAC码流。 尽管该音频编码器的代码十分简单,但是几乎包含了使用FFMPEG编码一个音频所有必备的API。十分适合FFmpeg的初学者。 工程基于VC2010。 使用了2014.5.6版本的...
在FFmpeg中,使用`-c:a aac`参数指定AAC编码器,通过`-b:a 64k`设置比特率为64kbps,确保音频质量和文件大小的平衡。 3. **MP3编码**:MPEG Audio Layer III(MP3)是一种广泛使用的音频压缩格式,尽管它的压缩效率...
6. **编码音频帧(AVFrame)**:将PCM数据转换为`AVFrame`,然后使用`avcodec_send_frame()`函数将音频帧发送到编码器。编码器会处理这些帧并返回编码后的数据。 7. **接收编码后的数据**:调用`avcodec_receive_...
该音频编码器实现了音频PCM采样数据编码为AAC码流。 尽管该音频编码器的代码十分简单,但是几乎包含了使用FFMPEG编码一个音频所有必备的API。十分适合FFmpeg的初学者。 1.1版本增加了多平台下编译的支持:Windows,...
在C++中使用FFmpeg可以实现音频编码器,本文将详细介绍如何构建一个最简单的基于FFMPEG的音频编码器。 FFmpeg 包含了多种音频和视频编解码库,如libavcodec(编解码)、libavformat(容器格式处理)和libavutil...
在这个基于FFmpeg4.0.2的AAC编码器项目中,开发者在Windows 10 64位环境下,成功地创建了一个程序,能够利用FFmpeg的新版本将PCM( Pulse Code Modulation,脉冲编码调制)音频数据编码为AAC(Advanced Audio Coding...
总之,FFmpeg提供了一个简单而强大的接口,用于将PCM音频转换为AAC格式。无论是简单的命令行操作还是深入的编程集成,FFmpeg都是处理音频和视频任务的理想工具。了解和掌握FFmpeg的使用,将极大地提升你在多媒体处理...
在这里,`-i`指定输入文件,`-c:a aac`指定了音频编码器为AAC,`output.aac`是输出文件名。 4. 设置参数:如果需要自定义AAC编码参数,可以添加额外选项。例如,调整比特率(`-b:a`)、质量(`-qscale:a`)或使用...
这里,`-i`参数指定输入音频文件,`-f`指定输出格式,`s16le`表示小端16位PCM格式,`-acodec`指定音频编码器,`pcm_s16le`是对应的PCM编码,`output_pcm_file`是输出的PCM文件名。 在这个“TestSavePCM”示例中,...
本示例"44.1KHz或48KHz两通道使用CoreAudio采集音频ffmpeg编码AAC的demo"聚焦于利用苹果的CoreAudio框架捕获声音数据,并通过FFmpeg进行音频编码,将原始的PCM(脉冲编码调制)数据转换为高效的AAC(高级音频编码)...
- **选择编码器**:FFmpeg支持多种音频编码器,通过`avcodec_find_encoder()`函数可以根据编码器名称找到合适的编码器上下文(`AVCodecContext`)。 - **初始化上下文**:使用`avcodec_open2()`函数打开编码器,...
4. **ffmpeg的音频编码选项**:在编码过程中,可以调整各种参数以优化音质或减小文件大小,例如比特率、编码器质量设置等。例如,`-b:a 128k`表示设置音频比特率为128kbps。 5. **处理PCM数据的库函数**:如果你...
libfdk-aac作为高效的AAC编码器,为音频压缩提供了高质量和高效率的解决方案。通过使用FFmpeg工具,我们可以轻松地将PCM音频转换为AAC,满足不同的应用场景需求,如流媒体服务、移动设备和网络传输。在实际操作中,...
在本示例中,我们将探讨如何使用C++通过FFmpeg库从RTMP流中提取音频,并将其转换为16KHz、16位的PCM(脉冲编码调制)格式。这个过程对于音频处理、语音识别或者实时通信应用非常常见。 首先,我们需要在项目中集成...
FFmpeg的libavcodec库包含了许多音频编码器,例如AAC、MP3、Opus等。通过调用FFmpeg的API,我们可以选择合适的编码器对原始音频数据进行编码,将其转换成特定格式的数据流。 5. **封装** 将编码后的音频数据封装成...
这意味着用户可以按照说明,将自己的音频设备名称替换到代码中,以适应不同的硬件环境,实现从麦克风采集音频,经由FFmpeg编码为AAC格式,最后保存到本地文件的功能。 总结起来,这个项目演示了如何利用FFmpeg在VS...
3. **AAC编码**:使用AAC编码器,如FAAC或AAC-LC,将PCM数据编码为AAC流。这通常需要设置编码参数,如比特率、采样率、声道数等,并调用编码API完成编码过程。 4. **编译动态链接库**:将上述C/C++代码打包成.so...
此外,描述中还提到了 **Speex 直接转 AAC** 的可能性,这意味着音频数据可以跳过 PCM 阶段,直接从 Speex 编码转换到 AAC 编码,这可能涉及到特定的编解码器实现。 **链表** 在这里可能用于管理音频数据的存储和...
这里`-i`参数指定输入文件,`-c:a aac`表示设置音频编码器为AAC,`output.aac`则是输出的AAC文件。 3. **自定义参数**:如果需要调整音频质量、比特率等参数,可以添加更多选项,例如: ``` ffmpeg -i input.pcm...