ffmpeg (三):ffmpeg结合SDL2.0解码音频流
// 2014/3/9 -- 19:24更新
- FILE *pFile;
- pFile = fopen("wavinflag.pcm", "wb");
- while( av_read_frame(pFormatCtx, packet) >= 0 ) {
- if( packet->stream_index == audioStream ) {
- int got_picture;
- int ret = avcodec_decode_audio4( audioCodecCtx, audioFrame, &got_picture, packet);
- if( ret < 0 ) {
- printf("Error in decoding audio frame.\n");
- exit(0);
- }
- if( got_picture ) {
- int in_samples = audioFrame->nb_samples;
- short *sample_buffer = (short*)malloc(audioFrame->nb_samples * 2 * 2);
- memset(sample_buffer, 0, audioFrame->nb_samples * 4);
- printf("in_samples = %d\n", in_samples);
- int i=0;
- float *inputChannel0 = (float*)(audioFrame->extended_data[0]);
- // Mono
- if( audioFrame->channels == 1 ) {
- for( i=0; i<in_samples; i++ ) {
- float sample = *inputChannel0++;
- if( sample < -1.0f ) {
- sample = -1.0f;
- } else if( sample > 1.0f ) {
- sample = 1.0f;
- }
- sample_buffer[i] = (int16_t)(sample * 32767.0f);
- }
- } else { // Stereo
- float* inputChannel1 = (float*)(audioFrame->extended_data[1]);
- for( i=0; i<in_samples; i++) {
- sample_buffer[i*2] = (int16_t)((*inputChannel0++) * 32767.0f);
- sample_buffer[i*2+1] = (int16_t)((*inputChannel1++) * 32767.0f);
- }
- }
- fwrite(sample_buffer, 2, in_samples*2, pFile);
- }
- }
- // Free the packet that was allocated by av_read_frame
- av_free_packet(packet);
- }
在使用ffmpeg解码aac的时候,如果使用avcodec_decode_audio4函数解码,那么解码出来的会是AV_SAMPLE_FMT_FLTP 格式的数据( float, 4bit , planar), 如果我们希望得到16bit的数据(如AV_SAMPLE_FMT_S16P数据),那么我们需要转换一下:
解決方式:
將 samples 由 32bits 转为16bits. 参考 ffmpeg samplefmt.h
若 sample 是 AV_SAMPLE_FMT_FLTP,則 sample 會是 float 格式,且值域为 [-1.0, 1.0]
若 sample 是 AV_SAMPLE_FMT_S16, 則 sample 會是 int16 格式,且值域为 [-32767, +32767]
这里SDL2.0播放pcm有点问题,还没弄会。
将FLTP转为S16代码,详细代码这里下载。
ffmpeg (三):ffmpeg结合SDL2.0解码音频流相关推荐
- ffmpeg (二):ffmpeg结合SDL2.0解码视频流
转自:http://blog.csdn.net/oldmtn/article/details/20284721 看了http://blog.csdn.NET/leixiaohua1020/articl ...
- VScode配置ffmpeg+sdl2.0开发环境(window+MinGW)
目录 VScode下载及安装: 下载 安装c/c++扩展包 MinGW-64下载及安装: 下载: 安装: 测试: VScode配置c++编译调试环境 新建测试工程 配置c/c++环境配置文件文件c_c ...
- 最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)
===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...
- 最简单的基于FFMPEG+SDL的音频播放器 ver2 (采用SDL2.0)
===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...
- 用FFMpeg5.0解码SDL2.0播放制作跨平台音乐播放器
在此我以windows为例,用FFMpeg解码SDL作为音频播放制作一个简单的播放器.同样的做法可以在linux,MacOS,Andriond等系统都是可行的.因为FFMpeg和SDL都是开源的多平台 ...
- 【Qt+FFmpeg】 - FFmpeg解码详细流程
目录 一:视频解码流程 二:FFMPEG解码流程 三:FFmpeg解码函数 四:FFmpeg解码的数据结构 五:FFmpeg数据结构简介 六:FFmpeg数据结构分析 七:像素数据转换 八:FFMPE ...
- 【Qt+FFmpeg】FFmpeg解码本地视频流程
目录 一.视频播放器的实现框架 1.解封装(Demuxing) 2.解码(Decode) 3.音视频同步 二.FFmpeg解码视频流程 1.FFmpeg解码视频流程图 2. 代码实现 一.视频播放器的 ...
- 【七】【vlc-android】vlc的decoder控制层传输数据与ffmpeg音频解码模块decoder层进行解码的数据交互流程源码分析
[以mp4文件格式和AAC.H264编码的本地文件为例展开分析] 由第六章节可知音频解码器的加载方式与视频解码器也是类似的. 通过此前分析过的模块加载方式,可找到ffmpeg解码和编码模块的初始化加载 ...
- FFmpeg再学习 -- 硬件加速编解码
为了搞硬件加速编解码,用了一周时间来看 CUDA,接下来开始加以总结. 一.什么是 CUDA (1)首先需要了解一下,什么是 CUDA. 参看:百度百科 -- CUDA 参看:CUDA基础介绍 参看: ...
最新文章
- JAVA高级特性--自动拆箱-装箱,枚举类型
- java线程——join
- 计算机视觉(AI)的算法有哪些,具体都有哪些特点?
- 对ActiveRecord的评论
- mybatis 调用 oracle 存储过程 select into 无记录时NO_DATA_FOUND异常处理分析
- SAP标准培训课程C4C10学习笔记(三)第三单元
- 使用IndexReader.repen提高搜索速度
- QLive EULA
- python正则匹配找到所有的浮点数_如何利用Python抓取静态网站及其内部资源
- 谈PaaS平台建设:如何应对企业架构多元异构资源的挑战
- 内置函数——hasattr() 函数
- python中字典的知识讲解
- 一个屌丝程序猿的人生(五十三)
- Java内存模型(JMM)
- 写一个判断素数的函数,在主函数输入一个整数,输出是否为素数的信息
- 水货苹果笔记本(Mac Book)验机流程
- 大数据随记 —— Hadoop 环境搭建
- 橱柜选购要简约实用 合理配置能够节省成本
- win10默认网关不可用解决
- php文件怎么打开你知道吗?
热门文章
- SQL*Plus环境下创建PLUSTRACE角色
- Java 操作MySql Blob 字段
- 机器学习--详解基于梯度下降的Logistic回归算法原理
- mft文件记录属性头包括_学懂主流NTFS分区文件系统,你也可以成为MM眼中的大神!...
- 虚拟仪器的python实现_基于Python的虚拟仪器技术探究及实现.pdf
- python精彩编程200例百度_完整word版,python经典例题100道
- LeetCode 985 Sum of Even Numbers After Queries 解题报告
- linux安装svn(yum安装)
- Vue.js(2.x)之插值
- [BZOJ4542] [Hnoi2016] 大数 (莫队)