FastASR+FFmpeg(音视频开发+语音识别)(一)

简介: FastASR+FFmpeg(音视频开发+语音识别)(一)

  想要更好的做一件事情,不仅仅需要知道如何使用,还应该知道一些基础的概念。

一、音视频处理基本梳理

       1.多媒体文件的理解

       

       1.1 结构分析

       多媒体文件本质上可以理解为一个容器

       容器里有很多流

       每种流是由不同编码器编码的

       在众多包中包含着多个帧(帧在音视频的处理中是最小单位)

       1.2 封装格式

       封装格式(也叫容器) 就是将已经编码压缩好的视频流、音频流及字幕流按照一定的方案放到一个文件中,便于播放软件播放。一般来说,视频文件的后缀就是它的封装格式。封装格式不一样,后缀名也就不一样(xxx.mp4 xxx.flv)。

       1.3 音视频同步

       Audio Master:同步视频到音频

       Video Master:   同步音频到视频

       External Clock Master: 同步音频和视频到外部时钟

       1.4 音视频录制原理

       

       1.5 音视频播放原理

       

        1.6 音视频播放原理

       

    2.音视频的基础概念

      2.1 声音

        对自然界的声音进行采样,采样就是在时间轴上对信号进行数字化信号,即按照一定时间间隔t在模拟信号x(t)上逐点采取其瞬时值。采样率越高,声音的还原程度越高,质量就越好,同时占用空间会变大。

       量化:用有限个幅度近似原来连续的幅度值把模拟信号的连续幅度变成有限数量的有一定间隔的离散值。【采样值的精确度取决于它用多小位来表示,这就是量化。例如8位量化可以表示256个不同的值,而CD质量的16位可以表示65536个值,范围-32769-32767】

我们来算下这个值:

       编码:安装一定的规律把量化后的值用二进制数字表示,然后转化成二值或多值的数字信号流。这样得到的数字信号可以通过电缆,卫星通信等数字线路传输。接收端与上述过程相反。

编码如何理解:

       我们在学校上学的时候应该听老师讲过哈夫曼编码,道理其实都一样。采用某种形式将某个值变成唯一的,有效的编码可以提高安全性、压缩数据等有效功效。

       PCM:上面数字化的过程又称为脉冲编码调制,通常我们说音频的裸数据格式就是脉冲编码调制数据。描述一段PCM数据需要4量化指标:采样率、位深度、字节序、声道数。

       采样率:每秒钟采样多少次,以Hz为单位。

无线广播

22000(22kHz)

CD音质

44100(44.1kHz)

数字电视(DVD)

48000(48Hz)

蓝光(高清DVD)

96000(96kHz)

蓝光(高清DVD)

192000(192kHz)

       位深度(Bit-depth):表示用多小个二进制位来描述采样数据,一般位16bit。

       字节序:表示音频PCM数据存储的字节序是大端存储还是小端存储,为了数据处理效率高效,通常采用小端存储。

       声道数(channel number):当前PCM文件中包含的声道数是单声道还是双声道

       比特率:每秒传输的bit数,单位为bps(Bit Per Second)。间接衡量声音质量的一个标准。没有压缩的音频数据的比特率=采样频率*采样精度*通道数。

       码率:压缩后的音频数据的比特率。码率越大,压缩效率越低,音质越好,压缩后数据越大。码率=音频文件大小/时长。

FM质量

96kps

一般质量音频

128-160kbps

CD质量

192kbps

高质量音频

256-320kbps

       

       帧:每次编码的采样单元数。比如MP3通常是1152个采样点作为一个编码单元,AAC通常是1024个采样点作为一个编码单元。

       帧长:可以指每帧播放的持续时间。每帧持续时间(秒)=每帧采样点数/采样频率(HZ)。也可以指压缩后每帧的数据长度。

       音频编码:主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量,偏于存储和传输

MP3

一种数字音频编码和有损压缩格式,用于大幅度降低音频数量。

AAC

AAC比MP3有更高的压缩比,同样大小的音频文件,AAC音质更高。

WMA

本身包含有损和无损压缩格式

2.2图像

       图像是客观对象的一种相似性的、生动性的描述或写真,是人类社会活动中最常用的信息载体。或者说图像是客观对象的一种表示,它包含了被描述对象的有关信息。它是人们最主要的信息源。

       像素:屏幕显示是把有效面积化为很多个小格子,每个格子只显示一种颜色,是成像的最小元素,因此就叫做"像素"。

       分辨率:屏幕在长度和宽度这两个方向上各有多少个像素,就叫做分辨率,一般用A x B来表示。分辨率越高,每个像素的面积越小,显示效果就越平滑细腻。

       RGB表示图像:8bit表示一个子像素: 取值范围[0~255] 或者 [00~FF]例如图像格式RGBA_8888,表示4个8bit表示一个像素,而RGB_565用5+6+5bit表示一个像素。一张1280*720的RGBA_8888格式的图片大小=1280 x 720 x 32bit。所以每一张图像的裸数据都是很大的。一部90分钟的电影,没秒25帧: 90 * 60 * 25 * 1280 * 720 * 32 bit = 463.48G

       YUV表示图像:YUV,是另外一种颜色编码方法,视频的裸数据一般使用 YUV 数据格式表示。Y 表示明亮度,也称灰度 值(灰阶值)。UY 表示色度,均表示影响的色彩和饱和度,用于指定像素的颜色。

       亮度:需要透过 RGB 输入信号建立,方式为将 RGB 信号的特定部分(g 分量信号)叠加到一起。

       色度:定义了颜色的色调和饱和度,分别用 Cr、Cb 表示,(C 代表分量(是 component 的缩写))。Cr 反映 RGB 输入信号红色部分与 RGB 信号亮度值之间的差异。Cb 反映 RGB 输入信号蓝色部分与 RGB 信号亮度值之间的差异。

       2.3视频

       由于人类眼睛的特殊结构,画面快速切换时,画面会有残留( 视觉暂留),感觉起来就是连贯的动作。所以 ,视频就是由一系列图片构成的。

       视频码率:指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数据流精度就越高。

       视频帧率:通常说一个视频的25帧,指的就是这个视频帧率,即1秒中会显示25帧。帧率越高,给人的视觉就越流畅。

       视频分辨率:分辨率就是我们常说的640x480分辨率、1920x1080分辨率,分辨率影响视频图像的大小。

       帧:帧不需要参考其他画面而生成,解码时仅靠自己就重构完整图像。

       视频的编码:编码的目的就是为了压缩, 让各种视频的体积变得更小,有利于存储和传输。国际上主流制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准 有 H.261、H.263、H.263+、H.264 等,另一个是“国际标准化组织(ISO)”它制定的标准有 MPEG-1、MPEG-2、 MPEG-4 等。

WMV

微软推出的一种流媒体格式,它是在“同门”的 ASF 格式升级延伸来得。在同等视频质量下,WMV 格式的文件可以边下载边播放,因此很适合在网上播放和传输。

VP8

来自 On2 的 WebM, VPX(VP6,VP7,VP8,VP9),这个编码设计用于 web 视频。

WebRTC

在 2010 年 5 月,Google 以大约 6820 万美元收购了 VoIP 软件开发商 Global IP Solutions 公司,并因此获得了该公司拥有的 WebRTC 技术。WebRTC 集成 VP8, VP9。

AV1

是一个开放,免专利的视频编码格式,针对互联网传输视频而设计。

AVS

是中国具备自主知识产权的第二代信源编码标准,是《信息技术先进音视频编码》系列标准的简称, 其包括系统、视频、音频、数字版权管理等四个主要技术标准和符合性测试等支撑标准。

H265

与 H.264 编解码器相比,HEVC 在压缩方面提供了重大的改进。HEVC 压缩视频的效率比 H.264 要高出两倍。使用 HEVC,相同视觉质量的视频只占用一半的空间。

VP9

是由 Google 开发的开放式、无版权费的视频编码标准,VP9 也被视为是 VP8 的下一代视频编码标准。

3.常用的音视频处理第三方库

3.2.1基本概念

       FFmpeg(Fast Forward MPEG)是全球领先的多媒体框架,能够解码(decode)、编码(encode)、转码(transcode)、复用(mux)、解复用(demux)、流化(stream)、滤波(filter)和播放几乎人类和机器创造的所有多媒体文件。

3.2.2 FFmpeg 主要基本组成

       FFmpeg的封装模块AVFormat:AVFormat实现了多媒体领域绝大数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、 TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmepg是否支持某种媒体封装格式取决于编译时是否包含了该格式的封装库。

      FFmpeg的编解码模块AVCodec:AVCodec包括大多数常用的编解码格式,既支持编码也支持解码。除了支持MPEG4、AAC、MJPEG等自带的媒体格式也支持H.264(x264编码器)、H.265(X265编码器)、MP3(libMP3lame编码器)

       FFmepg的滤镜模块AVFilter:AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。

       FFmpeg的视频图像转换计算模块swscale:swscale模块提供了高级别的图像转换API,它能够对图像进行缩放和像素格式转换。

       FFmpeg的音频转换计算模块swresample:swresample提供了音频重采样API,支持音频采样、音频通道布局、布局调整。

3.2.3 FFmpeg 优劣

  • 高可移植性:可以在Linux、Mac、Windows等系统上编译、运行以及通过FATE(FFMPEG自动化测试环境)测试。
  • 高性能:专门针对X86、arm、MIPS、ppc等大多数主流的处理器提供了对应的汇编级的优化实现。
  • 高度安全: FFMPEG官对代码审查总是考虑安全性,而且一旦发布的版本中有安全性的Bug都会尽快的修复并更新发布版本
  • 高度易用性:FFMPEG提供的API都有相关的注释,且官方也有对应的说明文档
  • 支持的格式多样性:FFMPEG支持很多媒体格式的解码、编码、复用、解复用等功能,不管是很老的格式,还是比较新的格式均有不错的支持
  • 无法识别有空格的文件名
  • FFMPEG编码时,时间戳只需要指定AVFrame的pts字段

3.2.4 FFmpeg的安装配置

Windows

比较简单

Linux

方法1(yum安装) 不过这个版本有点旧

  1. 更新新系统

Sudo yum install epel-release -y

Sudo yum update -y

  1. 导入密钥并设置源

sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

  1. 安装ffmpeg

yum -y install ffmpeg ffmpeg-devel

  1. 检查版本

ffmpeg -version

方法 2(编译安装)

先下载源码包:

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

进入ffmpeg文件夹,依次执行下列语句:

cd ffmpeg

./configure

make

make install

将编译好的ffmpeg复制到bin目录

cp ffmpeg /usr/bin/ffmpeg

检查版本

ffmpeg -version

3.2.5 FFmpeg的命令行使用

获取媒体文件信息

ffmpeg -i 文件全路径 -hide_banner

示例: ffmpeg -i video_file.mp4 -hide_banner

注: -hide_banner 隐藏ffmpeg本身的信息,只显示文件相关信息(编码器、数据流等)。

转换媒体文件(可以实现在不同媒体格式之间进行自由转换)

注:ffmpeg会从后缀名猜测格式

ffmpeg -i 待转换的文件路径 转换后的文件路径

示例: ffmpeg -i video_input.mp4 video_output.avi

ffmpeg -i video_input.webm video_output.flv

ffmpeg -i audio_input.mp3 video_output.ogg

ffmpeg -i audio_input.wav audio_output.flac video_output.flv

参数: -qscale 0 保留原始的视频质量

从视频中提取音频

ffmpeg -i 视频全路径 -vn 需要保存的音频文件全路径 -hide_banner

参数说明:

-vn 从视频中提取音频

-ab 指定编码比特率(一些常见的比特率 96k、128k、192k、256k、320k)

-ar 采样率(22050、441000、48000)

-ac 声道数

-f 音频格式(通常会自动识别)

视频静音-(纯视频)

ffmpeg -i video_input.mp4 -an -video_output.mp4

注: -an 标记会让所有视频的音频参数无效,因为最后没有音频产生

视频文件中提取截图

ffmpeg -i 视频文件名 -r 帧率 -f 输出格式 输出文件名

示例: ffmpeg -i video.mp4 -r 1 -f image2 image-%3d.png

参数说明:

-r 帧率(一秒内导出多少张图像,默认25)

-f 代表输出格式(image2实际上是image2序列的意思)

更改视频分辨率或长宽比

ffmpeg -i 视频文件名 -s 分辩率 -c:a -aspect 长:宽 输出文件名

示例:ffmpeg -i video_input.mov -s 1024x576 -c:a video_output.mp4

参数说明:

-s 缩放视频

-c:a 保证音频编码正确

-aspect 更改长宽比

为音频增加封面(音频转视频)

当你想往某一个网站上传音频,但那个网站只接受视频的情况下非常适用

示例:ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a acc -strict experimental -b:a 192k -shortest output.mp4

-c:v 视频编码

-c:a 音频编码

注:如果是4.x版本以上,不需要加 -strict experimental

为视频增加字幕

ffmpeg -i video.mp4 -i subtitles.srt -c:v copy -c:a copy -preset veryfast -c:s mov_text -map 0 -map 1 output.mp4

相关实践学习
达摩院智能语音交互 - 声纹识别技术
声纹识别是基于每个发音人的发音器官构造不同,识别当前发音人的身份。按照任务具体分为两种: 声纹辨认:从说话人集合中判别出测试语音所属的说话人,为多选一的问题 声纹确认:判断测试语音是否由目标说话人所说,是二选一的问题(是或者不是) 按照应用具体分为两种: 文本相关:要求使用者重复指定的话语,通常包含与训练信息相同的文本(精度较高,适合当前应用模式) 文本无关:对使用者发音内容和语言没有要求,受信道环境影响比较大,精度不高 本课程主要介绍声纹识别的原型技术、系统架构及应用案例等。 讲师介绍: 郑斯奇,达摩院算法专家,毕业于美国哈佛大学,研究方向包括声纹识别、性别、年龄、语种识别等。致力于推动端侧声纹与个性化技术的研究和大规模应用。
相关文章
|
30天前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
105 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
1月前
|
编解码 语音技术 内存技术
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
《FFmpeg开发实战:从零基础到短视频上线》一书中的“5.1.2 把音频流保存为PCM文件”章节介绍了将媒体文件中的音频流转换为原始PCM音频的方法。示例代码直接保存解码后的PCM数据,保留了原始音频的采样频率、声道数量和采样位数。但在实际应用中,有时需要特定规格的PCM音频。例如,某些语音识别引擎仅接受16位PCM数据,而标准MP3音频通常采用32位采样,因此需将32位MP3音频转换为16位PCM音频。
57 0
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
|
1月前
|
XML 开发工具 Android开发
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
ExoPlayer最初是为了解决Android早期MediaPlayer控件对网络视频兼容性差的问题而推出的。现在,Android官方已将其升级并纳入Jetpack的Media3库,使其成为音视频操作的统一引擎。新版ExoPlayer支持多种协议,解决了设备和系统碎片化问题,可在整个Android生态中一致运行。通过修改`build.gradle`文件、布局文件及Activity代码,并添加必要的权限,即可集成并使用ExoPlayer进行网络视频播放。具体步骤包括引入依赖库、配置播放界面、编写播放逻辑以及添加互联网访问权限。
139 1
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
|
1月前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
74 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
2月前
|
XML Java Android开发
FFmpeg开发笔记(五十二)移动端的国产视频播放器GSYVideoPlayer
GSYVideoPlayer是一款国产移动端视频播放器,支持弹幕、滤镜、广告等功能,采用IJKPlayer、Media3(EXOPlayer)、MediaPlayer及AliPlayer多种内核。截至2024年8月,其GitHub星标数达2万。集成时需使用新版Android Studio,并按特定步骤配置依赖与权限。提供了NormalGSYVideoPlayer、GSYADVideoPlayer及ListGSYVideoPlayer三种控件,支持HLS、RTMP等多种直播链接。
100 18
FFmpeg开发笔记(五十二)移动端的国产视频播放器GSYVideoPlayer
|
1月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
85 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher
EasyPusher是一款国产RTSP直播录制推流客户端工具,支持Windows、Linux、Android及iOS等系统。尽管其GitHub仓库(安卓版:https://github.com/EasyDarwin/EasyPusher-Android)已多年未更新,但通过一系列改造,如升级SDK版本、迁移到AndroidX、指定本地NDK版本及更新Gradle版本等,仍可在最新Android Studio上运行。以下是针对Android Studio Dolphin版本的具体改造步骤。
60 3
FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher
|
1月前
|
Android开发 开发者
FFmpeg开发笔记(五十七)使用Media3的Transformer加工视频文件
谷歌推出的Transformer,作为Jetpack Media3架构的一部分,助力开发者实现音视频格式转换与编辑。Media3简化了媒体处理流程,提升了定制性和可靠性。Transformer可用于剪辑、添加滤镜等操作,其示例代码可在指定GitHub仓库中找到。要使用Transformer,需在`build.gradle`中添加相关依赖,并按文档编写处理逻辑,最终完成音视频转换任务。具体步骤包括配置剪辑参数、设置空间效果以及监听转换事件等。
52 0
FFmpeg开发笔记(五十七)使用Media3的Transformer加工视频文件
|
1月前
|
Linux 视频直播
FFmpeg开发笔记(五十四)使用EasyPusher实现移动端的RTSP直播
本文介绍了如何使用EasyPusher-Android实现RTSP直播流程。首先对比了RTSP、RTMP、SRT和RIST四种流媒体协议,并以RTSP为例,详细说明了使用EasyPusher-Android向流媒体服务器进行RTSP直播推流的方法。文中还提供了OBS Studio配置RTSP插件及ZLMediaKit云服务器部署的相关信息,通过修改EasyPusher-Android源码使其支持通用RTSP地址,最终验证了直播功能的成功实现。
56 0
FFmpeg开发笔记(五十四)使用EasyPusher实现移动端的RTSP直播
|
2月前
|
编解码 移动开发 安全
FFmpeg开发笔记(五十)聊聊几种流媒体传输技术的前世今生
自互联网普及以来,流媒体技术特别是视频直播技术不断进步,出现了多种传输协议。早期的MMS由微软主导,但随WMV格式衰落而减少使用。RTSP由网景和RealNetworks联合提出,支持多种格式,但在某些现代应用中不再受支持。RTMP由Adobe开发,曾广泛用于网络直播,但因HTML5不支持Flash而受影响。HLS由苹果开发,基于HTTP,适用于点播。SRT和RIST均为较新协议,强调安全与可靠性,尤其SRT在电视直播中应用增多。尽管RTMP仍占一定市场,但SRT等新协议正逐渐兴起。
102 8
FFmpeg开发笔记(五十)聊聊几种流媒体传输技术的前世今生

热门文章

最新文章

下一篇
无影云桌面