[✔️]FFMpeg的音频处理

简介: [✔️]FFMpeg的音频处理

PCM


PCM全称Pulse-Code Modulation,脉冲调制编码。是未经压缩的音频采样数据裸流,由模拟信号经过采样、量化、编码转换成的标准数字音频数据。


描述PCM的6个参数:


  1. Sample Rate


采样频率。8kHz(电话)、44.1kHz(CD)、48kHz(DVD)。


  1. Sample Size


量化位数。通常该值为16-bit。


  1. Number of Channels


通道个数。常见的音频有立体声(stereo)和单声道(mono)两种类型,立体声包含左声道和右声道。另外还有环绕立体声等其它不太常用的类型。


  1. Sign


表示样本数据是否是有符号位,比如用一字节表示的样本数据,有符号的话表示范围为-128 ~ 127,无符号是0 ~ 255。


  1. Byte Ordering字节序。字节序是little-endian还是big-endian。通常均为little-endian。


  1. Integer Or Floating Point整形或浮点型。大多数格式的PCM样本数据使用整形表示,而在一些对精度要求高的应用方面,使用浮点类型表示PCM样本数据。


image.png


经ffmpeg解码的音频帧一般会有多个pcm采样数据(AVFrame->nb_samples),AAC_LC为1024,根据采样数据的布局和格式,我们可以算出每个帧中采样数据的内存占用


双声道AV_CH_LAYOUT_STEREO 布局,采样格式AV_SAMPLE_FMT_S16,一个AAC_LC帧采样数据占用 2*(16/8)*1024 =4096字节


对于采样率为44100Hz,一个音频帧的播放时间为 1024/44100 ≈ 23.22ms。


av_rescale_rnd


int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const;


计算 "a * b / c" 的值并分五种方式来取整 一般的使用方法


int dstNbSamples = av_rescale_rnd(
    frame->nb_samples, codecContext->sample_rate,
    codecContext->sample_rate, AV_ROUND_UP);


这个计算的是新的采样数量2:采样数量1*采样频率1/采样频率2


采样数量*采样频率=一帧的采样数量


av_samples_get_buffer_size


这个函数只能用于音频,计算要把一系列的样本保存起来,需要多大的缓存


int av_samples_get_buffer_size(
    int *linesize, // 
    int nb_channels, // 通道的数量
    int nb_samples, // 单个通道的采样数量
    enum AVSampleFormat sample_fmt, // 采样格式
    int align // 字节对齐,0默认,1不对齐
);


swr_convert


音频重新采样,解析出来的数据为pcm数据。


播放音频


ffplay也支持播放音频,但是它使用的是SDL


Windows



MciPlayer.cpp


mciSendCommand


mpg123


windows播放pcm的小例子


Android


非engine代码


  • AudioBufferProvider.h


  • AudioMixer.h


  • AudioMixerOps.h


  • AudioResampler.h


  • AudioResamplerCubic.h


  • AudioResamplerPublic.h


  • mp3reader.h


  • tinysndfile.h


播放 pcm 数据目前比较流行的有两种方式:


  • 一种是通过 Android 的 AudioTrack 来播放



  • openal: a cross-platform 3D audio API appropriate for use with gaming applications


  • sdl


SDL


SDL是 “Simple DirectMedia Layer”的缩写,SDL是一个开源的跨平台的多媒体库,封装了复杂的音视频底层操作,简化了音视频处理的难度。


Github


image.png

目录
相关文章
|
缓存
【SVN异常】svn更新时,出现不知道这样的主机的解决方案
svn更新时,出现不知道这样的主机的解决方案
1992 0
【SVN异常】svn更新时,出现不知道这样的主机的解决方案
|
人工智能 大数据
1+X大数据分析与应用中级备考经验
作为上海城建职业学院人工智能应用学院大数据技术专业的专任教师,在2020年12月份指导学生参与阿里巴巴《1+X大数据分析与应用中级》考试中,取得了优异的成绩。34位参加考证的同学,共有27个同学通过了考试,再次分享备考经验,以供参考。
2860 2
1+X大数据分析与应用中级备考经验
|
存储 Unix 编译器
汇编语言----X86汇编指令
汇编语言----X86汇编指令
1285 2
|
JavaScript API
使用vue3+vite+electron构建小项目介绍Electron进程间通信
使用vue3+vite+electron构建小项目介绍Electron进程间通信
1787 3
|
12月前
|
Web App开发 人工智能 安全
指南:Google Gemini 2.0 Pro国内版 (Gemini 2.0国内使用指南)
据称,谷歌 AI 推出的 Gemini Pro 国内版,是一款性能卓越的大型语言模型,其能力和表现均超越了广受欢迎的 ChatGPT。作为 Fostmar 的重大升级,它将为用户带来前所未有的 AI 交互体验
2978 0
|
JavaScript 前端开发
我为展开收起功能做了动画,被老板称赞!
【8月更文挑战第23天】我为展开收起功能做了动画,被老板称赞!
597 1
我为展开收起功能做了动画,被老板称赞!
|
IDE Java 编译器
关于win10下codeblock的中文乱码问题解决
乱码问题通常是由于不同平台编码不一致导致的。本文介绍了如何在 Code::Blocks 中解决这一问题,具体步骤包括选择编译器、配置编译选项,并添加 `-finput-charset=UTF-8` 和 `-fexec-charset=GBK` 参数。此外,还补充了一些常见的字符集知识。
|
数据可视化 JavaScript 前端开发
低代码可视化Uniapp点击事件-代码生成器
低代码可视化Uniapp点击事件-代码生成器
381 0
低代码可视化Uniapp点击事件-代码生成器
SDL基础使用04(SDL_image与SDL_mixer扩展库)
本文介绍了如何使用SDL_image和SDL_mixer扩展库在SDL项目中加载和显示图片以及播放音频文件。
752 1
|
开发框架 缓存 前端开发
实战.NET Framework 迁移到 .NET 5/6
从.NET Framework 迁移到.NET 5/6 是一次重要的技术革新,涵盖开发环境与应用架构的全面升级。本文通过具体案例详细解析迁移流程,包括评估现有应用、利用.NET Portability Analyzer 工具识别可移植代码、创建新项目、逐步迁移代码及处理依赖项更新等关键步骤。特别关注命名空间调整、JSON 序列化工具更换及数据库访问层重构等内容,旨在帮助开发者掌握最佳实践,确保迁移过程平稳高效,同时提升应用性能与可维护性。
461 2

热门文章

最新文章