硬汉嵌入式论坛

 找回密码
 立即注册
查看: 222|回复: 5
收起左侧

[STM32H7] 基于STM32H7和ESP32S3的网络收音机开发实战指南[理论篇]ffmpeg与ts文件分析【2】

[复制链接]

4

主题

12

回帖

29

积分

新手上路

积分
29
发表于 5 天前 | 显示全部楼层 |阅读模式
导论
    “我只是个软件工程师,开发了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的音视频了】,
    11.png
    否则,只能按网上教程,去下载了。【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位比,明显后者的分辨率更高,更加还原音频细节【当然,一般人的耳朵不一定听得出来】
    12.png
    --------------------------------------------------------------------------------------------------------------
    单双通道这个就简单了,双声道左右声道的数据交叉存放,根据不同协议,存放顺序,时序又有不同,这块和mcu驱动有关,讲到对应内容时,再展开介绍。
    扩展个知识点5.1声道是由前置左/右声道、后置左/右环绕声道、中置声道及重低音声道组成的多声道音频系统,其中“.1”表示频响范围20-120Hz的低频独立输出声道。该系统通过五个全频段扬声器与一个超低音扬声器组合,可精确还原人声对白、环境音效及动态低音,广泛应用于家庭影院、车载音响等。
    --------------------------------------------------------------------------------------------------------------
    为什么让读者了解音频里很重要的一些概念呢?
    基础不牢,地动山摇。下面链接是百度语音识别的api接口和一些关键参数说明,如果看不懂的话,如何按百度的要求上传符合要求的原始音频文件呢【音频采集】?那还怎么做音频相关的东西呢?
      https://ai.baidu.com/ai-doc/SPEECH/Jlbxdezuf
      17.png


   这里以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                  【进你自己的文件存放路径】
13.png
   上图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配置解码器和解码参数的核心数据!!!
14.png 15.png


上面示例ts文件粗略解析后的总结
    这是一个纯音频片段(无视频、无字幕),时长约 10 秒;音频编码是 AAC-LC(兼容性拉满),立体声 + 48kHz 采样率 + 191kb/s 比特率,音质中等偏上;可直接用播放器打开【vlc可以直接播放】,或用 FFmpeg 无损提取为 .aac 文件(ffmpeg -i 输入.ts -map 0:0 -c copy 输出.aac),也可转码为 MP3 等格式。
    这里我们为了后续的解码,使用命令提前提取ts里的 aac压缩音频,方便我们自己软件提取出来的和这个进行对比,确认是否提取ok。
       16.png
   经过上述,我们就得到了一个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)


评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

0

主题

77

回帖

77

积分

初级会员

积分
77
发表于 4 天前 | 显示全部楼层
看了楼主的介绍,才知道 ffmpeg 是个人开发的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119681
QQ
发表于 4 天前 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

5

主题

228

回帖

243

积分

高级会员

积分
243
发表于 4 天前 | 显示全部楼层
很多年前就用过ffmpeg了,不过只用过一次,早已忘光
回复

使用道具 举报

35

主题

224

回帖

329

积分

高级会员

积分
329
发表于 4 天前 | 显示全部楼层
ffmpeg确实是个好东西
回复

使用道具 举报

2

主题

24

回帖

30

积分

新手上路

积分
30
发表于 3 天前 | 显示全部楼层
感谢楼主分享,学到了很多知识,期待下章部分esp32s3和stm32h7如何通信
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-12-6 10:26 , Processed in 0.050180 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表