|
|
导论
“我只是个软件工程师,开发了qemu和ffmpeg,其它的我不愿多谈”。
作为开源世界的独行侠,法国传奇程序员Fabrice Bellard 开发了著名的tcc、qemu、quickjs和ffmpeg等。。。他以一己之力搭建了现在互联网音视频生态的基础建设。
https://www.bilibili.com/video/B ... 91c48e707c5a3773372
这么厉害的一个音视频处理工具,灰常适合我们用于分析音频和进行各种音频处理(例如mp3和各种音频格式互转,超级强大,99%的播放器和格式转换,就是ffmpeg套个gui的壳,参见互联网的ffmpeg耻辱柱,白嫖人家还不遵守协议)。
章节要点
作为承载着最终音频的ts片段,如何按照hls协议,提取出我们要的acc压缩音频数据呢?
本章要求读者有一定的音频基础知识、熟悉ts文件格式,不懂的地方问ai/baidu/google
ffmpeg简单分析ts文件
如果你安装过openmv(打过电赛/卖过山寨openmv/学习简单的视觉图像处理),那么你电脑上已经有打包好的exe了【只有ffmpeg的部分功能,够我们玩mcu的音视频了】,
否则,只能按网上教程,去下载了。【do it for yourself.】
这三个都是 FFmpeg 工具集里的核心可执行程序,分工明确,分别对应音视频处理、播放和分析功能,具体作用如下:
- ffmpeg.exe
核心是音视频编解码与格式处理工具,功能十分全面。它能读取音视频文件或流,完成解封装、解码、编码、重新封装等一系列操作,实现格式转换、参数调整、内容剪辑、流媒体推流等需求。比如执行ffmpeg -i test.mp4 test_out.avi可将 MP4 格式转为 AVI 格式;也能提取视频中的音频,或是给视频添加滤镜、调整分辨率和帧率等。 - ffplay.exe
是 FFmpeg 自带的轻量命令行音视频播放器,依赖 SDL 库实现音视频渲染播放。它不仅能播放本地各类格式的音视频文件,还能播放网络流,常用来快速测试音视频文件是否正常、验证转码效果等。播放时还能显示音频波形、视频帧信息等,比如用ffplay input.mp4可直接播放视频,通过ffplay INPUT -loop 5能实现文件循环播放 5 次。 - ffprobe.exe
专注于多媒体文件的信息分析工具。它可解析本地文件或网络流的元数据,输出音视频的详细参数,像视频的编码格式、分辨率、帧率,音频的采样率、声道数,还有文件总时长、码率等。同时也能用于调试损坏的媒体文件,定位流错误。例如ffprobe --show_streams test.avi能查看视频和音频流的详细信息,用 JSON 格式输出信息的命令可方便脚本解析数据。
接下来我们思考下:当你得到一个音频文件,需要了解的几个要素是啥?
这个音频是采用哪种压缩方式啊?采样率多高啊?位深多少啊?单声道还是双声道啊(5.1声道不在讨论中)?在动手前,这些基础知识,不了解就得了解完,再继续往下看,不然怎么设置mcu的解析参数呢?
这里带大家快速熟悉这块内容【这块做专题讲的话,可以出本书了】。。。
--------------------------------------------------------------------------------------------------------------
常见有损音频压缩格式:[color=rgba(0, 0, 0, 0.85)]MP3、AAC、OGG(Vorbis)、WMA、Opus
常见无损音频压缩格式:[color=rgba(0, 0, 0, 0.85)]FLAC、ALAC、APE、DSD [color=rgba(0, 0, 0, 0.85)](注:WAV 为未压缩格式,非压缩后无损)
各种格式的优缺点?常见的应用场景?读者有兴趣主动吸收下知识,这里和本文关系不大。
--------------------------------------------------------------------------------------------------------------
常见的采样率8kHz(电话通讯)、44.1kHz(音频CD与MP3)、48kHz(数字电视与DVD)、11025Hz(AM调幅广播)、22050Hz与24000Hz(FM调频广播),以及192kHz(DVD-Audio)
例如48KHz就是1s采集48K个点,如果adc是16位,采集双声道,则1s的数据量是 48K*2Bytes*2channel = 192KB,说明了,还原音频越好,就会记录越多细节,越吃内存,解码时,mcu就会吭哧吭哧的更累。。。
--------------------------------------------------------------------------------------------------------------
量化位数决定信号强度记录精度,如CD采用16位采样可记录2^16级电平值,采样率与量化位数共同影响音频还原质量。像一般mcu dac是12位,和wm8978的16,24,32位比,明显后者的分辨率更高,更加还原音频细节【当然,一般人的耳朵不一定听得出来】
--------------------------------------------------------------------------------------------------------------
单双通道这个就简单了,双声道左右声道的数据交叉存放,根据不同协议,存放顺序,时序又有不同,这块和mcu驱动有关,讲到对应内容时,再展开介绍。
扩展个知识点:5.1声道是由前置左/右声道、后置左/右环绕声道、中置声道及重低音声道组成的多声道音频系统,其中“.1”表示频响范围20-120Hz的低频独立输出声道。该系统通过五个全频段扬声器与一个超低音扬声器组合,可精确还原人声对白、环境音效及动态低音,广泛应用于家庭影院、车载音响等。
--------------------------------------------------------------------------------------------------------------
为什么让读者了解音频里很重要的一些概念呢?
基础不牢,地动山摇。下面链接是百度语音识别的api接口和一些关键参数说明,如果看不懂的话,如何按百度的要求上传符合要求的原始音频文件呢【音频采集】?那还怎么做音频相关的东西呢?
https://ai.baidu.com/ai-doc/SPEECH/Jlbxdezuf
这里以openmv上安装好的ffmpeg为例,开始准备输入命令行控制ffmpeg对从网页音频流里捕获的ts文件进行分析了。
1 windows + R,输入cmd,进入dos窗口
2 切换到exe目录下, cd /d C:\Program Files\OpenMV IDE\share\qtcreator\ffmpeg\windows\bin 【进你自己的安装目录】
3 加载ts文件,使用ffmpeg进行分析 ffmpeg -i C:\Users\syc\Desktop\v16\13298480.ts 【进你自己的文件存放路径】
上图ffmpeg给出了[color=rgba(0, 0, 0, 0.85)]解析后的 TS 文件的编码格式、分辨率、比特率、音视频流信息、时长等元数据 。这里我们就可以得出 央视fm直流音频流的几个解码需要的灰常关键的信息!!
Duration: 00:00:09.86, start: 75991.340356, bitrate: 204 kb/s
Stream #0:0[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 191 kb/s
----------------------------------------------------------------------------------------------------------------------
当前音频分片的播放[color=rgba(0, 0, 0, 0.85)]总时长:9.86 秒 -- 解码可用
[color=rgba(0, 0, 0, 0.85)] ts stream流的起始时间戳为[color=rgba(0, 0, 0, 0.85)]75991.340356【[color=rgba(0, 0, 0, 0.85)]原始录制 / 传输时的 “绝对时间”(比如从某个基准点开始计算的秒数)[color=rgba(0, 0, 0, 0.85)]】--不用关心
[color=rgba(0, 0, 0, 0.85)] 音频比特率 204kb/s [color=rgba(0, 0, 0, 0.85)]--了解即可
码率是什么?对mcu解码的影响又如何?
音频码率(比特率)= 单位时间内传输 / 存储的音频数据量(单位:bps,比特 / 秒),核心是 码率越高,音质越接近原始信号,文件体积也越大,是平衡音质与存储 / 传输效率的关键指标。
简单说:本质是 “音频数据的传输速度”,直接决定音质细节保留程度;有损压缩(MP3/AAC)中,码率与音质正相关(如 128kbps 日常用,320kbps 接近无损);无损压缩(FLAC)中,码率是原始数据经无损算法压缩后的结果,不影响音质,仅反映压缩效率。
码率越高,当然越吃mcu资源了,对存储外设读写、sram读写性能、等要求更高。
流索引/流PID:PID用来区分不同流(比如视频 PID、音频 PID)的,我们用来解析提取音频内容时用。-- 重要
当前音频格式为 aac-lc,编码识别标识0x000F,采样率48KHz,双声道 -- mcu配置解码器和解码参数的核心数据!!!
上面示例ts文件粗略解析后的总结
这是一个纯音频片段(无视频、无字幕),时长约 10 秒;音频编码是 AAC-LC(兼容性拉满),立体声 + 48kHz 采样率 + 191kb/s 比特率,音质中等偏上;可直接用播放器打开【vlc可以直接播放】,或用 FFmpeg 无损提取为 .aac 文件(ffmpeg -i 输入.ts -map 0:0 -c copy 输出.aac),也可转码为 MP3 等格式。
这里我们为了后续的解码,使用命令提前提取ts里的 aac压缩音频,方便我们自己软件提取出来的和这个进行对比,确认是否提取ok。
经过上述,我们就得到了一个ts文件,一个提取成功的aac音频文件。注意,央广这个音频未加密【加密与否的参数在ts文件结构里】,故此可以直接解码播放
ts文件结构【提取节目参数+音频数据】
这块内容吧,其实笔者写几个关键点,方便读者理解就行了,细节太丰富了,ts可是能传音视频的,这里还只是简单的音频流。ai能详细的回答读者们的疑问,笔者复制过来还得截图半天,各种排版,还是评论区看看大家意见吧。
最好的学习方法是读者边对照下面“ts解码实现”小节的源码,边理解ts文件结构,自己脑海中形成 解码的过程,这样,这节你就彻底掌握了。
这块涉及到ts里很多概念和分段解析的流程。 有兴趣的探索吧,当然,直接用现成的软件也可以,it is up to you.
MPEG-TS(Transport Stream)是一种用于音视频传输的容器格式,主要结构如下:
TS 包(188 字节固定长度),每个 TS 包格式如下:
字节偏移 名称 长度 含义
0 Sync Byte 8bit 固定为 0x47,表示包头起始
1-2 PID (Packet ID) 13bit 标识包属于哪个流(PAT/PMT/音频/视频等)
3 Adaptation Field Control 2bit 是否有自适应字段、是否有有效载荷
4+ Adaptation Field (可选) 0~183字节 时间戳、PCR 等
可变 Payload (有效载荷) 剩余字节 可能是 PAT/PMT/PES 数据等
关键子表。。。【进一步细节参见chatGPT吧,笔者不赘述了】
。。。
这里笔者给出整体思路【软件编程思路】
整个程序的处理流程可以概括为:
TS 文件 → PAT (找 PMT PID) → PMT (找音频 PID + 格式) → PES (拼接音频帧) → 写出 .aac 或 .mp3
ts解码实现
来,笔者来抄袭下,哦,不,,,参考下日本人的demo。遵循开源协议,笔者会把改成python验证的版本一起发到gitee/github【已完成】。
https://github.com/Yokohama-Miyazawa/convertTStoAAC
央广为什么选acc,而不是mp3格式呢?
答案:"流量就是钱"。
aac为什么比mp3省带宽,读者问问ai哈,,,笔者懒得打字了。。。
后面会出专题讲mp3和aac。
开发参考资源
ffmpeg百度百科 https://baike.baidu.com/item/ffmpeg/2665727
5.1声道百度百科 https://baike.baidu.com/item/5.1%E5%A3%B0%E9%81%93/3442580
chatGPT
立创开源广场的几个做的不错的山寨openmv【stm32h743+ov5640】
https://oshwhub.com/affinelab/openmv4h750
https://oshwhub.com/affinelab/openmv4_plus
https://oshwhub.com/fanghaoling/stm32h7-kai-fa-ban
原版openmv作者的资源 https://github.com/openmv
https://openmv.io/collections/all-products
下章预告
解码aac方案软硬件方案各有哪些?为什么选择当前方案?
esp32s3和stm32h7如何通信?软件如何发挥2个处理器的最佳性能?
下下章预告
选择什么样的aac解码库,有哪些开源库,性能如何,如何使用?
aac和mp3各有哪些标准?它们之间又有什么区别?各自的底层理论又是什么?
附件
当你成功使用pc或者mcu编程【什么编程语言无所谓,只是工具而已】从ts里提取aac数据ok了,这章的目的就达到了。
【ts文件,分析用】13298480.zip
(237.34 KB, 下载次数: 0)
convertTStoAAC-main.zip
(16.21 KB, 下载次数: 0)
|
评分
-
查看全部评分
|