ffmpegandroid版(音学习基础)

开发环境vs2010 环境比较老一下程序要求输出一个pcm数据,使用pcm工具可以打开播放在这里简单介绍ffmpeg的api调用后面还会写个整个audio的播放,会提供统一的工程,下面我们就来聊聊关于ffmpegandroid版?接下来我们就一起去了解一下吧!

ffmpegandroid版(音学习基础)

ffmpegandroid版

开发环境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);

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

这是安卓音视频学习系列笔记,笔记目录如下,欢迎移步到shennongblog.com查看更多内容!

  • 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自制简单音视频播放器
,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页