开发环境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自制简单音视频播放器
欢迎大家批评指正