Linux驱动19 --- FFMPEG

目录

一、音视频基础知识

[1.1 介绍](#1.1 介绍)

[1.2 视频](#1.2 视频)

视频常见格式

视频帧的格式

视频采集设备

[linux 中关于视频设备的内核驱动](#linux 中关于视频设备的内核驱动)

V4L2

YUV

[视频帧 --- 必须记住](#视频帧 --- 必须记住)

视频编码格式

H.264

[1.3 音频](#1.3 音频)

常见的音频格式

音频的原始格式

影响音频质量的参数

影响音频质量的参数

音频的编码格式

[Linux 下音频开发必要工具](#Linux 下音频开发必要工具)

[1.4 软件编解码和硬件编解码](#1.4 软件编解码和硬件编解码)

二、FFMPEG

[2.1 介绍](#2.1 介绍)

[2.2 FFMPEG 简介](#2.2 FFMPEG 简介)

[2.3 FFMPEG 编译](#2.3 FFMPEG 编译)

让可执行程序在系统任何地方都可以起作用

配置库路径

[2.4 FFMPEG 的应用](#2.4 FFMPEG 的应用)


一、音视频基础知识

1.1 介绍

音视频开发是当前驱动编程的核心之一 ,和摄像头有关

当前阶段主要会学习:视频的解码,音频的解码

1.2 视频

点成线,线成面 ,多个连续画面的切换 --- 视频

MCU 开发中的视频:动图

你需要将动图分割为一个一个的图片

图片依次取模,图片依次显示 --- 组成动图

视频是由一帧一帧的画面组成的

视频常见格式

mp4、mkv 等

视频是由图片组成的

常见的图片格式 --- jpg,png,bmp,jpeg 等等

在开发中显示的图片格式都是 --- RGB

屏幕的像素点组成是 RGB 三色灯

视频帧的格式

MJPEG、YUV(YUYV,YCbCr)

部分情况下称之为视频的原始格式、视频采集格式

视频帧的格式来自于视频采集设备

视频采集设备 --- 采集到的并不是 RGB 格式

视频采集设备

常见的就是:摄像头

在 Linux 系统中,有默认的摄像头开发方法

linux 中关于视频设备的内核驱动
V4L2

V4L2 是 Video for linux2 的简称,为 linux 中关于视频设备的内核驱动。在 Linux 中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video 下,如果只有一个视频设备,通常为/dev/video0。V4L2 在设计时,是要支持很多广泛的设备的,它们之中只有一部分在本质上是真正的视频设备。

在嵌入式设备中,/dev/video 有好几个

在 ubuntu 下可以通过安装插件来使用摄像头

下载指令:sudo apt install cheese

执行指令:cheese

摄像头采集到的格式:在程序中通过 V4L2 的相关 API 进行获取

不同的视频图像格式支持的分辨率是不一样

不同的分辨率对应的视频帧数又是不同的

影响视频质量的参数

分辨率、帧率、图像格式

参数均和视频采集设备有关

采集设备决定了视频质量的参数

这些参数可以通过视频采集设备获取

YUV

YUV,是一种颜色编码方法。常使用在各个视频处理组件中。 YUV 在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。

Y'代表明亮度(luma;brightness)而 U 与 V 存储色度(色讯;chrominance;color)部分;亮度(luminance)记作 Y,而 Y'的 prime 符号记作伽玛校正。

U:表示蓝色

V:表示红色

Y′UV,YUV,YCbCr,YPbPr 所指涉的范围,常有混淆或重叠的情况。从历史的演变来说,其中 YUV 和 Y'UV 通常用来编码电视的模拟信号,而 YCbCr 则是用来描述数字的视频信号,适合视频与图片压缩以及传输,例如 MPEG、JPEG。但在现今,YUV通常已经在电脑系统上广泛使用。

主要在于应用场景区别

YUV 主要有三种格式:YUV444,YUV422,YUV420

YUV444 --- 一个 Y 分量占用一个 UV 分量

例如:仅作为理解

Y 分量占一个字节,U 分量占一个字节,V 分量占一个字节

4 个像素点需要 12 字节

YUV422 --- 两个 Y 分量占用一个 UV 分量

4 个像素点需要 8 字节

YUV420 --- 四个 Y 分量占用一个 UV 分量

4 个像素点需要 6 字节

压缩比率越来越高,相同的视频占用的空间越来越小

视频采集设备在采集之初就已经压缩了一次了,但是对于视频数据的传输和存储需要更高的压缩方式

视频帧 --- 必须记住

通过不同帧的大小缩减整体视频的大小

I 帧、P 帧、B 帧

I 帧:完全帧、关键帧 --- 包含了一帧图像的完整数据

P 帧:预测帧 --- 根据上一张图像的内容,来完成当前图像的显示

B 帧:双向帧、双向差别帧 --- 根据上一帧图像和下一帧图像,补全当前的图像

I、P、B 帧的大小依次越来越小

视频编码格式

视频的进一步压缩

H264、H265

H.264

我们是协议/标准的使用者,而不是制定者

同时也是 MPEG-4 第十部分,是由 ITU-T 视频编码专家组(VCEG)和 ISO/IEC 动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264/AVC(或者 AVC/H.264 或者 H.264/MPEG-4 AVC 或 MPEG-4/H.264 AVC)而明确的说明它两方面的开发者。

H.264 作为 MPEG-4 第十部分,由国际电联(ITU-T)的视频编码专家组(VCEG)与 ISO/IEC 的动态图像专家组(MPEG)共同推出的高度压缩数字视频编解****码器标准,广泛应用于各种视频处理领域。而 H.265,即 HEVC(高效率视频编码),在 H.264 基础上进行了改进优化,包括码流、编码质量、延时等方面的提升,旨在提高压缩效率、增强鲁棒性和错误恢复能力,同时降低实时时延和复杂度

最常遇到的面试问题:

H264 和 H265 之间的区别? --- 上面的区别

你为什么选择 H264/在使用上的区别?

H265 对硬件的要求更高,H264 在查找资料上要更占优势

移植、使用

移植:将需要的库,在 ubuntu 上通过交叉编译工具配置之后,将所需的库复制到开发板环境中

使用:程序的编译,运行

1.3 音频

常见的音频格式

mp3,wav,flac,aac 等,这些音频格式都是压缩过的音频格式了

音频的原始格式

PCM

脉冲编码调制(PulseCodeModulation),简称 PCM。是对连续变化的模拟信号进行抽样、量化和编码产生的数字信号。PCM 的优点就是音质好,缺点就是体积大。PCM 可以提供用户从 2M 到 155M 速率的数字数据专线业务,也可以提供话音、图象传送、远程教学等其他业务。PCM 有两个标准(表现形式):E1 和 T1。

现实生活中比较接近 PCM 的音频载体:黑胶唱片

影响音频质量的参数

音频采集设备和音频输出设备

音频采集设备 --- 麦克风/咪头

音频输出设备 --- 扬声器

查看自己的音频设备

音频采集设备:arecord -L

音频输出设备:aplay -L

影响音频质量的参数

声音对于采集设备来说是一个模拟量

采集设备需要将模拟量转为数字量 --- 进行存储

采样率:每秒钟采样音频的次数

8KHz、16KHz、44.1KHz、48KHz

采样数:确定多少次数据为一帧数据

1024、1152

对于很多的音频格式,使用 1024 会不支持

采样位数:8 位、16 位

声道数:双声道,单声道

音频的编码格式

AAC,G711A,MP2

AAC:AAC(Advanced Audio Coding),中文名:高级音频编码。出现于1997 年,基于 MPEG-2 的音频编码技术。由 Fraunhofer IIS、杜比实验室、AT&T、索尼等公司共同开发,目的是取代 MP3 格式。

G711A:G.711 是一种由国际电信联盟(ITU-T)制定的音频编码方式,又称为 ITU-T G.711。它是国际电信联盟 ITU-T 定制出来的一套语音压缩标准,它代表了对数 PCM(logarithmic pulse-code modulation)抽样标准,主要用于电话。它主要用脉冲编码调制对音频采样,采样率为 8k 每秒。它利用一个 64Kbps 未压缩通道传输语音讯号。起压缩率为 1:2, 即把 16 位数据压缩成 8 位。G.711 是主流的波形声音编解码器。

mp2,是 MPEG 音频文件,(MPEG-1 音讯部份)中订立之有损性音讯压缩格式。此标准还制订了 MPEG-1 Audio Layer I (MP1)和 MPEG-1 Audio Layer III (MP3)。个人电脑和互联网音乐流行 MP3,MP2 则多用于广播。

后续的 MP2 的音频和 H264的视频共同合成一个音视频文件

Linux 下音频开发必要工具

ALSA

ALSA 是 Advanced Linux Sound Architecture 的缩写,高级 Linux 声音架构的简称,它在 Linux 操作系统上提供了音频和 MIDI(Musical Instrument DigitalInterface,音乐设备数字化接口)的支持。在 2.6 系列内核中,ALSA 已经成为默认的声音子系统,用来替换 2.4 系列内核中的 OSS(Open Sound System,开放声音系统)

1.4 软件编解码和硬件编解码

软件编解码:全靠 CPU 去算

硬件编解码:靠 GPU 或者 NPU 去计算

GPU --- 比较纯粹的渲染显示图像的

NPU --- 训练模型

人脸识别,行为识别,物品识别等等

硬件编解码的优点:快

软件编程码的优点:硬件编解码需要通过 API 去调用硬件设备

简单

二、FFMPEG

2.1 介绍

音视频开发会用到音视频专门的库文件

通用免费的:FFMPEG,SDL

嵌入式开发中还有不开源的:后续还会使用其中一个 --- RkMedia

2.2 FFMPEG 简介

FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用 LGPL 或 GPL 许可证。它提供了录制、转换以及流化音视频的完整解决方案。

官网 https://ffmpeg.org/ ,版本不同,FFMEPG 的 API 接口也不一定相同

2.3 FFMPEG 编译

必要库:sudo apt install yasm libx264-dev libsdl2-dev libmp3lame-dev libopus-dev libavdevice-dev libfdk-aac-dev

FFMPEG 通过参数的配置来选择不同的工作环境以及不同的应用场景

编译成功之后得到以下 4 个文件夹

其中 bin 就是可执行程序

lib 就是使用的赖库

让可执行程序在系统任何地方都可以起作用

ffmpeg:ffmpeg 中的核心指令

几乎除了播放,剩下的都可以用

ffplay:主要用来播放音视频

ffprobe:获取音视频文件的信息的 --- 极少用

配置库路径

2.4 FFMPEG 的应用

http://www.360doc.com/content/22/0724/11/9824753_1041178087.shtml

相关推荐
sakoba2 分钟前
nginx学习
java·运维·学习·nginx·基础
彦楠4 分钟前
win通过OpenSSL生成.ssh id_rsa密钥方法
运维·ssh
书山有路勤为径~20 分钟前
1 51单片机-C51语法
单片机·嵌入式硬件·51单片机
Ronin30529 分钟前
【Linux系统】基础IO(下)
linux·运维·服务器
玖疯子37 分钟前
PyCharm高效入门指南大纲
java·运维·服务器·apache·wordpress
宇宙核43 分钟前
【内网穿透】使用FRP实现内网与公网Linux/Ubuntu服务器穿透&项目部署&多项目穿透方案
运维·服务器·网络
@Ryan Ding1 小时前
Ansible自动化运维工具详解
linux·运维·centos
IT成长日记1 小时前
【自动化运维神器Ansible】Ansible常用模块之Copy模块详解
运维·自动化·ansible·copy·常用模块、
竹竿袅袅1 小时前
Keepalived 原理及配置(高可用)
运维·云原生·lvs·keepalived·haproxy·高可用
huangyuchi.2 小时前
【Linux】进程切换与优先级
linux·运维·笔记·进程切换·进程优先级·寄存器·linux调度算法