生成原始PCM数据

#include <stdio.h>
#include <stdlib.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
#include <libswscale/swscale.h>
#include <libswresample/swresample.h>
int main(){char* fileName = "./jichi.mp4";char* outFile = "./jichi.pcm";AVFormatContext* avf_cxt = NULL;//设置日志打印级别// av_log_set_level(AV_LOG_INFO);//1. 注册组件av_register_all();//2. 打开输入的文件int ret = avformat_open_input(&avf_cxt,fileName,NULL,NULL);if(ret < 0){printf("文件地址错误 %s  \n",fileName);return -1;}//3. 读取文件信息失败ret = avformat_find_stream_info(avf_cxt,NULL);if(ret < 0){printf("不能获取到文件多媒体信息  %s  \n",fileName);goto _end;}//打印文件信息av_dump_format(avf_cxt,0,fileName,0);int audio_index = -1;//找到文件中的视频流索引for(int i = 0; i < avf_cxt->nb_streams;i++){if( avf_cxt->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO){audio_index = i;break;}}if(audio_index == -1){printf("没有找到文件中的音频流 \n");goto _end;}//4. 在avformatContext中得到avcodecContextAVCodecContext *avc_cxt = avf_cxt->streams[audio_index]->codec;///再根据上下文拿到编解码id,通过该id拿到解码器AVCodec *avcodec = avcodec_find_decoder(avc_cxt->codec_id);if(avcodec == NULL){printf("不能得到音频的解码器 \n");goto _end;}//5. 打开解码器ret = avcodec_open2(avc_cxt,avcodec,NULL);if(ret < 0){printf("不能打开解码器");goto _end;}AVPacket *avp = av_packet_alloc();AVFrame *avf = av_frame_alloc();//frame->16bit 44100 PCM 统一音频采样格式与采样率SwrContext* swr_cxt = swr_alloc();//重采样设置选项-----------------------------------------------------------start//输入的采样格式enum AVSampleFormat in_sample_fmt = avc_cxt->sample_fmt;//输出的采样格式enum AVSampleFormat out_sample_fmt = AV_SAMPLE_FMT_S16;//输入的采样率int in_sample_rate = avc_cxt->sample_rate;//输出的采样率int out_sample_rate = 44100;//输入的声道布局uint64_t in_ch_layout = avc_cxt->channel_layout;//输出的声道布局uint64_t out_ch_layout = AV_CH_LAYOUT_MONO;//SwrContext 设置参数swr_alloc_set_opts(swr_cxt,out_ch_layout,out_sample_fmt,out_sample_rate,in_ch_layout,in_sample_fmt,in_sample_rate,0,NULL);//初始化SwrContextswr_init(swr_cxt);//重采样设置选项-----------------------------------------------------------end//获取输出的声道个数int out_channel_nb = av_get_channel_layout_nb_channels(out_ch_layout);//存储pcm数据uint8_t *out_buf = (uint8_t*)av_malloc(2*44100);FILE *fb_out = fopen(outFile,"wb+");int got_frame, frame_count = 0;//6.一帧一帧读取压缩的音频数据AVPacketwhile(av_read_frame(avf_cxt,avp) >= 0){if(avp->stream_index == audio_index){//解码从avpacket到avframeret = avcodec_decode_audio4(avc_cxt,avf,&got_frame,avp);// =0 表示解码完成if(ret < 0){av_log(NULL,AV_LOG_INFO,"解码完成  \n");}//表示正在解码if(got_frame != 0){// printf("正在解码第%d帧  \n",++frame_count);swr_convert(swr_cxt , &out_buf , 2 * 44100 , avf->data , avf->nb_samples);//获取sample的sizeint out_buf_size = av_samples_get_buffer_size(NULL,out_channel_nb,avf->nb_samples,out_sample_fmt,1);fwrite(out_buf,1,out_buf_size,fb_out);}}av_free_packet(avp);}_end:fclose(fb_out);av_frame_free(&avf);av_free(out_buf);swr_free(&swr_cxt);avcodec_close(avc_cxt);avformat_free_context(avf_cxt);return 0;
}

ffmpeg C代码音频解码相关推荐

  1. 【FFmpeg杂记】音频解码输出PCM格式数据分析

      FFmpeg音频解码后输出的为PCM数据,PCM中的声音数据没有被压缩.   FFmpeg中音视频数据基本上都有Packed和Planar两种存储方式,对于双声道音频来说,Packed方式为两个声 ...

  2. audioread-支持多种解码 (GStreamer + Core Audio + MAD + FFmpeg) 的python音频解码库

    解码支持 使用任何可用的后端解码音频文件都是支持的.该库当前支持: 通过PyGObject的Gstreamer. 通过ctypes在Mac OS X上的核心音频.(不需要PyObjC) 通过pymad ...

  3. 深入浅出:FFmpeg 音频解码与处理AVFrame全解析

    深入浅出:FFmpeg 音频解码与处理全解析 一.FFmpeg 简介 1.1 FFmpeg 的历史与发展 1.2 FFmpeg 的主要组成部分 二.音频编解码基础 (Basics of Audio E ...

  4. FFmpeg 开发(04):FFmpeg + OpenGLES 实现音频可视化播放

    本文基于上一篇文章 FFmpeg + OpenSLES 实现音频解码播放 ,利用 FFmpeg 对一个 Mp4 文件的音频流进行解码,然后将解码后的 PCM 音频数据进行重采样,最后利用 OpenSL ...

  5. ffmpeg中音频解码方法(附代码)+ffmpeg音频解码播放速度快的问题(随手笔记,以供查阅)

    最近在做一款取名为变速不变调播放器的时候,解码音频遇到了些问题(ffmpeg音频解码播放速度快的问题),网络上的方法对绝大多数的音视频文件有效,但是对于某些音频会有问题,比如某些ADPCM编码的WAV ...

  6. Android NDK开发之旅31 FFmpeg音频解码

    ###前言 #####基于Android NDK开发之旅30--FFmpeg视频播放这篇文章,我们已经学会视频解码基本过程.这篇文章就对音频解码进行分析. #####音频解码和视频解码的套路基本是一样 ...

  7. 基于 FFMPEG 的音频编解码(二):音频解码

    音频解码 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译 基于 FFMPEG 的音频编解码(二):音频解码 基于 FFMPEG 的音频编解码(三):音频编码 在 Hell ...

  8. 音视频开发之旅(36) -FFmpeg +OpenSL ES实现音频解码和播放

    目录 OpenSL ES基本介绍 OpenSL ES播放音频流程 代码实现 遇到的问题 资料 收获 上一篇我们通过AudioTrack实现了FFmpeg解码后的PCM音频数据的播放,在Android上 ...

  9. FFmpeg音频解码-音频可视化

    最近在做一个音频可视化的业务,网上有Java层的实现方法,但是业务需要用C实现,从原理出发其实很简单,先对音频进行解码,再计算分贝.这比把大象放进冰箱还简单.本文从音频可视化的业务为依托,以FFmpe ...

最新文章

  1. 802.1x 客户端获取ip过程 很详细
  2. curl linux 数组参数_Linux系统调用原理
  3. Git代码管理常用命令操作
  4. 3.IDA-数据显示窗口(导出窗口、导入窗口、String窗口、...窗口)
  5. 通过引入switch表达式来增强Java switch语句
  6. c++右值引用以及使用
  7. 电磁感应理论之父,法拉第传奇
  8. exchange服务器磁盘性能,如何解决Exchange磁盘空间问题
  9. sourcetree合并分支_不会git命令,没关系啊,还有强大的图形界面工具SourceTree
  10. dts directshow filter_DTS是什么?详解来了
  11. Git部署Git使用Git子模块
  12. get() got an unexpected keyword argument
  13. 【MTSP】遗传和粒子群算法求解多旅行商问题【Matlab 1156期】
  14. 梯度消失、爆炸产生的原因以及解决方法
  15. Crout分解法 | matlab
  16. 什么叫做会议中控及其实际应用
  17. IDear 创建web项目
  18. 《python爬虫实战》:爬取贴吧上的帖子
  19. CPU计算机性能的操作方法,cpu怎么设置才能达到最佳性能
  20. 筒仓计算表格_筒仓世界中的开源极客

热门文章

  1. 微服务 中台架构演进
  2. 允许网页打开android应用程序,通过浏览器直接打开Android应用程序
  3. 【微服务】链路追踪 jaeger
  4. LTE 终端如何申请 RB 资源以及现实面临的问题
  5. Linux系统的信号详解
  6. c语言结构体详解(struct)
  7. python编程midi键盘按键错乱_键盘按键错乱超简单解决教程
  8. win10时间同步服务器修改
  9. win10找不到gpedit.msc
  10. 第39级台阶(dp)