开发环境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("ou;, "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自制简单音视频播放器
1.文章《Android 音视频学习基础——1.4 ffmpeg pcm输出》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《Android 音视频学习基础——1.4 ffmpeg pcm输出》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好