ffmpeg C代码音频解码
生成原始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代码音频解码相关推荐
- 【FFmpeg杂记】音频解码输出PCM格式数据分析
FFmpeg音频解码后输出的为PCM数据,PCM中的声音数据没有被压缩. FFmpeg中音视频数据基本上都有Packed和Planar两种存储方式,对于双声道音频来说,Packed方式为两个声 ...
- audioread-支持多种解码 (GStreamer + Core Audio + MAD + FFmpeg) 的python音频解码库
解码支持 使用任何可用的后端解码音频文件都是支持的.该库当前支持: 通过PyGObject的Gstreamer. 通过ctypes在Mac OS X上的核心音频.(不需要PyObjC) 通过pymad ...
- 深入浅出:FFmpeg 音频解码与处理AVFrame全解析
深入浅出:FFmpeg 音频解码与处理全解析 一.FFmpeg 简介 1.1 FFmpeg 的历史与发展 1.2 FFmpeg 的主要组成部分 二.音频编解码基础 (Basics of Audio E ...
- FFmpeg 开发(04):FFmpeg + OpenGLES 实现音频可视化播放
本文基于上一篇文章 FFmpeg + OpenSLES 实现音频解码播放 ,利用 FFmpeg 对一个 Mp4 文件的音频流进行解码,然后将解码后的 PCM 音频数据进行重采样,最后利用 OpenSL ...
- ffmpeg中音频解码方法(附代码)+ffmpeg音频解码播放速度快的问题(随手笔记,以供查阅)
最近在做一款取名为变速不变调播放器的时候,解码音频遇到了些问题(ffmpeg音频解码播放速度快的问题),网络上的方法对绝大多数的音视频文件有效,但是对于某些音频会有问题,比如某些ADPCM编码的WAV ...
- Android NDK开发之旅31 FFmpeg音频解码
###前言 #####基于Android NDK开发之旅30--FFmpeg视频播放这篇文章,我们已经学会视频解码基本过程.这篇文章就对音频解码进行分析. #####音频解码和视频解码的套路基本是一样 ...
- 基于 FFMPEG 的音频编解码(二):音频解码
音频解码 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译 基于 FFMPEG 的音频编解码(二):音频解码 基于 FFMPEG 的音频编解码(三):音频编码 在 Hell ...
- 音视频开发之旅(36) -FFmpeg +OpenSL ES实现音频解码和播放
目录 OpenSL ES基本介绍 OpenSL ES播放音频流程 代码实现 遇到的问题 资料 收获 上一篇我们通过AudioTrack实现了FFmpeg解码后的PCM音频数据的播放,在Android上 ...
- FFmpeg音频解码-音频可视化
最近在做一个音频可视化的业务,网上有Java层的实现方法,但是业务需要用C实现,从原理出发其实很简单,先对音频进行解码,再计算分贝.这比把大象放进冰箱还简单.本文从音频可视化的业务为依托,以FFmpe ...
最新文章
- 802.1x 客户端获取ip过程 很详细
- curl linux 数组参数_Linux系统调用原理
- Git代码管理常用命令操作
- 3.IDA-数据显示窗口(导出窗口、导入窗口、String窗口、...窗口)
- 通过引入switch表达式来增强Java switch语句
- c++右值引用以及使用
- 电磁感应理论之父,法拉第传奇
- exchange服务器磁盘性能,如何解决Exchange磁盘空间问题
- sourcetree合并分支_不会git命令,没关系啊,还有强大的图形界面工具SourceTree
- dts directshow filter_DTS是什么?详解来了
- Git部署Git使用Git子模块
- get() got an unexpected keyword argument
- 【MTSP】遗传和粒子群算法求解多旅行商问题【Matlab 1156期】
- 梯度消失、爆炸产生的原因以及解决方法
- Crout分解法 | matlab
- 什么叫做会议中控及其实际应用
- IDear 创建web项目
- 《python爬虫实战》:爬取贴吧上的帖子
- CPU计算机性能的操作方法,cpu怎么设置才能达到最佳性能
- 筒仓计算表格_筒仓世界中的开源极客