1.4 ffmpeg pcm输出

  • A+
所属分类:安卓 音视频

开发环境vs2010 环境比较老。一下程序要求输出一个pcm数据,使用pcm工具可以打开播放。在这里简单介绍ffmpeg的api调用。后面还会写个整个audio的播放,会提供统一的工程。

AVFormatContext *pFormatCtx;

int i, audioStream;

AVCodecContext *pCodecCtx;

AVCodec *pCodec;

 

  • 首先定义一些变量。
char url[]="WavinFlag.aac";

av_register_all();

avformat_network_init();

pFormatCtx = avformat_alloc_context();

if(avformat_open_input(&pFormatCtx,url,NULL,NULL)!=0){

printf("Couldn't open input stream.\n");

return -1;

}

if(av_find_stream_info(pFormatCtx)<0){

printf("Couldn't find stream information.\n");

return -1;

}

 

 

  • 然后对ffmpeg进行初始化。并且av_find_stream_info找到相关的信息。
audioStream=-1;

for(i=0; i < pFormatCtx->nb_streams; i++)

if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){

audioStream=i;

break;

}

 

  • 找到audio流编号。
pCodec=avcodec_find_decoder(pCodecCtx->codec_id);

if(pCodec==NULL){

printf("Codec not found.\n");

return -1;

}

 

  • 找到audio解码器
if(avcodec_open2(pCodecCtx, pCodec,NULL)<0){

printf("Could not open codec.\n");

return -1;

}

 

  • 打开这个解码器
FILE *pFile=NULL;

pFile=fopen("output.pcm", "wb");

 

  • 定义一个pcm输出的file。
AVPacket *packet=(AVPacket *)malloc(sizeof(AVPacket));

av_init_packet(packet);

uint64_t out_channel_layout=AV_CH_LAYOUT_STEREO;

int out_nb_samples=1024;

AVSampleFormat out_sample_fmt=AV_SAMPLE_FMT_S16;

int out_sample_rate=44100;

int out_channels=av_get_channel_layout_nb_channels(out_channel_layout);

int out_buffer_size=av_samples_get_buffer_size(NULL,out_channels

,out_nb_samples,out_sample_fmt, 1);

uint8_t *out_buffer=(uint8_t *)av_malloc(MAX_AUDIO_FRAME_SIZE*2);

 

 

  • 准备输出了,准备输出的包(packet)和输出参数设置 和缓存buff。
AVFrame *pFrame;

pFrame=avcodec_alloc_frame();

 

  • 开始输出拿出,先拿到指针。
while(av_read_frame(pFormatCtx, packet)>=0){

if(packet->stream_index==audioStream){

ret = avcodec_decode_audio4( pCodecCtx, pFrame,&got_picture, packet);

if ( ret < 0 ) {

printf("Error in decoding audio frame.\n");

return -1;

}

if ( got_picture > 0 ){

swr_convert(au_convert_ctx,&out_buffer, MAX_AUDIO_FRAME_SIZE,(const uint8_t

**)pFrame->data , pFrame->nb_samples);

fwrite(out_buffer, 1, out_buffer_size, pFile);//写pcm文件,主意pcm的格式

index++;

}

av_free_packet(packet);

 

 

  • 疯狂输出,和写文件。
swr_free(&au_convert_ctx);
av_free(out_buffer);
avcodec_close(pCodecCtx);
av_close_input_file(pFormatCtx);
}

 

  • 关闭改关闭、释放改释放的资源。

 

Android 音视频学习基础--1.1 音视频基础知识
Android 音视频学习基础--1.2 需要认识的一些工具
Android 音视频学习基础--1.3 主流的开源项目
Android 音视频学习基础--1.4 ffmpeg pcm输出
Android 音视频学习基础--1.5 ffmpeg yuv输出
Android 音视频学习基础--1.6 ffmpeg 简单视频播放器
Android 音视频学习基础--1.7 Android最简单的音频播放器
Android 音视频学习基础--1.8 Android最简单的音频播放器
Android 音视频学习基础--1.9 Android最简单的视频播放器
Android 音视频学习基础--1.10 Android自制简单音视频播放器

Andro

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: