資源簡(jiǎn)介
該音頻編碼器實(shí)現(xiàn)了音頻PCM采樣數(shù)據(jù)編碼為AAC碼流。 盡管該音頻編碼器的代碼十分簡(jiǎn)單,但是幾乎包含了使用FFMPEG編碼一個(gè)音頻所有必備的API。十分適合FFmpeg的初學(xué)者。
1.1版本增加了多平臺(tái)下編譯的支持:Windows,MacOS,以及Linux。
代碼片段和文件信息
/**
?*最簡(jiǎn)單的基于FFmpeg的音頻編碼器
?*Simplest?FFmpeg?Audio?Encoder
?*
?*雷霄驊?Lei?Xiaohua
?*leixiaohua1020@126.com
?*中國(guó)傳媒大學(xué)/數(shù)字電視技術(shù)
?*Communication?University?of?China?/?Digital?TV?Technology
?*http://blog.csdn.net/leixiaohua1020
?*
?*本程序?qū)崿F(xiàn)了音頻PCM采樣數(shù)據(jù)編碼為壓縮碼流(MP3,WMA,AAC等)。
?*是最簡(jiǎn)單的FFmpeg音頻編碼方面的教程。
?*通過(guò)學(xué)習(xí)本例子可以了解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?
#define?__STDC_CONSTANT_MACROS
#ifdef?_WIN32
//Windows
extern?“C“
{
#include?“l(fā)ibavcodec/avcodec.h“
#include?“l(fā)ibavformat/avformat.h“
};
#else
//Linux...
#ifdef?__cplusplus
extern?“C“
{
#endif
#include?
#include?
#ifdef?__cplusplus
};
#endif
#endif
int?flush_encoder(AVFormatContext?*fmt_ctxunsigned?int?stream_index){
int?ret;
int?got_frame;
AVPacket?enc_pkt;
if?(!(fmt_ctx->streams[stream_index]->codec->codec->capabilities?&
CODEC_CAP_DELAY))
return?0;
while?(1)?{
enc_pkt.data?=?NULL;
enc_pkt.size?=?0;
av_init_packet(&enc_pkt);
ret?=?avcodec_encode_audio2?(fmt_ctx->streams[stream_index]->codec?&enc_pkt
NULL?&got_frame);
av_frame_free(NULL);
if?(ret?0)
break;
if?(!got_frame){
ret=0;
break;
}
printf(“Flush?Encoder:?Succeed?to?encode?1?frame!\tsize:%5d\n“enc_pkt.size);
/*?mux?encoded?frame?*/
ret?=?av_write_frame(fmt_ctx?&enc_pkt);
if?(ret?0)
break;
}
return?ret;
}
int?main(int?argc?char*?argv[])
{
AVFormatContext*?pFormatCtx;
AVOutputFormat*?fmt;
AVStream*?audio_st;
AVCodecContext*?pCodecCtx;
AVCodec*?pCodec;
uint8_t*?frame_buf;
AVframe*?pframe;
AVPacket?pkt;
int?got_frame=0;
int?ret=0;
int?size=0;
FILE?*in_file=NULL; ????????????????????????//Raw?PCM?data
int?framenum=1000;??????????????????????????//Audio?frame?number
const?char*?out_file?=?“tdjm.aac“;??????????//Output?URL
int?i;
in_file=?fopen(“tdjm.pcm“?“rb“);
av_register_all();
//Method?1.
pFormatCtx?=?avformat_alloc_context();
fmt?=?av_guess_format(NULL?out_file?NULL);
pFormatCtx->oformat?=?fmt;
//Method?2.
//avformat_alloc_output_context2(&pFormatCtx?NULL?NULL?out_file);
//fmt?=?pFormatCtx->oformat;
//Open?output?URL
if?(avio_open(&pFormatCtx->pbout_file?AVIO_FLAG_READ_WRITE)?0){
printf(“Failed?to?open?output?file!\n“);
return?-1;
}
audio_st?=?avformat_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;??
//Show?some?information
av_dump_format(pFormatCtx?0?out_file?1)
?屬性????????????大小?????日期????時(shí)間???名稱(chēng)
-----------?---------??----------?-----??----
?????文件??????????28??2015-02-12?17:38??.gitignore
?????文件?????????509??2015-02-12?17:38??readme.txt
?????文件???????63611??2015-02-12?17:38??simplest_ffmpeg_audio_encoder.jpg
?????文件?????????934??2015-02-12?17:38??simplest_ffmpeg_audio_encoder.sln
?????文件???????19968??2015-02-12?17:38??simplest_ffmpeg_audio_encoder.suo
?????目錄???????????0??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\
?????文件??????????67??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\.gitignore
?????文件?????????509??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\ReadMe.txt
?????文件????19294208??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\avcodec-56.dll
?????文件?????1341440??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\avdevice-56.dll
?????文件?????2201088??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\avfilter-5.dll
?????文件?????5721088??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\avformat-56.dll
?????文件??????424960??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\avutil-54.dll
?????文件?????????632??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\compile_cl.bat
?????文件?????????439??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\compile_gcc.sh
?????文件?????????459??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\compile_mingw.sh
?????目錄???????????0??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\
?????文件????????7976??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\_mingw.h
?????文件????????5721??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\inttypes.h
?????目錄???????????0??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\libavcodec\
?????文件??????177529??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\libavcodec\avcodec.h
?????文件????????3111??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\libavcodec\avfft.h
?????文件????????3659??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\libavcodec\dv_profile.h
?????文件????????2358??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\libavcodec\dxva2.h
?????文件???????10623??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\libavcodec\old_codec_ids.h
?????文件????????4007??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\libavcodec\vaapi.h
?????文件????????5437??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\libavcodec\vda.h
?????文件????????6200??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\libavcodec\vdpau.h
?????文件????????6035??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\libavcodec\version.h
?????文件????????6062??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\libavcodec\xvmc.h
?????目錄???????????0??2015-02-12?17:38??simplest_ffmpeg_audio_encoder\include\libavdevice\
............此處省略106個(gè)文件信息
評(píng)論
共有 條評(píng)論