摄像头监控开发

此处记录一些摄像头监控相关知识

音视频基础知识记录

参考链接

视频流程全解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
graph LR	
A[数据] --> B[解协议]
B --> C[封装格式数据]
C --> D[解封装]
D --> E[音频压缩数据]
E --> G[音频解码]
G --> I[音频原始数据]
I --> K[视音频同步]
K --> L[音频驱动/设备]
D --> F[视频压缩数据]
F --> H[视频解码]
H --> J[视频原始数据]
J --> K
K --> M[视频驱动/设备]
  • 解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
  • 解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
  • 解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。
  • 视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

流媒体协议

流媒体协议是服务器与客户端之间通信遵循的规定。当前网络上主要的流媒体协议如表所示。

主要流媒体协议一览

协议 HTTP-FLV RTMP HLS DASH
传输方式 http 流 Tcp 流 http 流 http 流
封装格式 flv Flv tag TS 文件 Mp4,3gp,webm
延时
数据分段 连续流 连续流 切片文件 切片文件
HTML5 播放 使用 Flv.js(由B站推出) 不支持 使用 hls.js 可播放 mp4, webm

总的来说,HTTP-FLV 和 RTMP 的延时较低,但由于数据分段为连续流,因此在网络环境不佳的情况下容易出现卡顿现象。HLS 和 DASH 的延时较高,但由于数据分段为切片文件,因此在网络环境不佳的情况下也能保证流畅播放。

名称 推出机构 传输层协议 客户端 目前使用领域
RTSP+RTP IETF TCP+UDP VLC, WMP IPTV
RTMP Adobe Inc. TCP Flash 互联网直播
RTMFP Adobe Inc. UDP Flash 互联网直播
MMS Microsoft Inc. TCP/UDP WMP 互联网直播+点播
HTTP WWW+IETF TCP Flash 互联网点播

下面都是adobe公司推出的流媒体协议开发流程:

RTMP协议 =避免TCP连接易被拦截的问题=> 因此开发了HTTP-FLV协议

苹果公司推出了HLS协议

HTTP-FLV延时低,是当下最主流的直播协议

注意:

  • RTMP可以用在双端
  • HTTPFLV,HLS只能用在拉流端

封装格式

封装格式的主要作用是把视频码流和音频码流按照一定的格式存储在一个文件中。现如今流行的封装格式如下表所示:

主要封装格式一览

名称 推出机构 流媒体 支持的视频编码 支持的音频编码 目前使用领域
AVI Microsoft Inc. 不支持 几乎所有格式 几乎所有格式 BT下载影视
MP4 MPEG 支持 MPEG-2, MPEG-4, H.264, H.263等 AAC, MPEG-1 Layers I, II, III, AC-3等 互联网视频网站
TS MPEG 支持 MPEG-1, MPEG-2, MPEG-4, H.264 MPEG-1 Layers I, II, III, AAC, IPTV,数字电视
FLV Adobe Inc. 支持 Sorenson, VP6, H.264 MP3, ADPCM, Linear PCM, AAC等 互联网视频网站
MKV CoreCodec Inc. 支持 几乎所有格式 几乎所有格式 互联网视频网站
RMVB Real Networks Inc. 支持 RealVideo 8, 9, 10 AAC, Cook Codec, RealAudio Lossless BT下载影视

由表可见,除了AVI之外,其他封装格式都支持流媒体,即可以“边下边播”。有些格式更“万能”一些,支持的视音频编码标准多一些,比如MKV。而有些格式则支持的相对比较少,比如说RMVB

视频编码格式

视频编码的主要作用是将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。如果视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。视频编码是视音频技术中最重要的技术之一。视频码流的数据量占了视音频总数据量的绝大部分。高效率的视频编码在同等的码率下,可以获得更高的视频质量。

相关原理参考 注:视频编码技术在整个视音频技术中应该是最复杂的技术

主要视频编码一览

名称 推出机构 推出时间 目前使用领域
HEVC(H.265) MPEG/ITU-T 2013 研发中
H.264 MPEG/ITU-T 2003 各个领域
MPEG4 MPEG 2001 不温不火
MPEG2 MPEG 1994 数字电视
VP9 Google 2013 研发中
VP8 Google 2008 不普及
VC-1 Microsoft Inc. 2006 微软平台

由表可见,有两种视频编码方案是最新推出的:VP9和HEVC。目前这两种方案都处于研发阶段,还没有到达实用的程度。当前使用最多的视频编码方案就是H.264。但未来HEVC将会取代H.264

参考此处的实际对比

整体来说同等码率的视频质量就是: HEVC > VP9 > H.264> VP8 > MPEG4 > H.263 > MPEG2

H.264仅仅是一个编码标准,而不是一个具体的编码器,H.264只是给编码器的实现提供参照用的

p.s. 学习H.264最标准的源代码,就是其官方标准JM了。但是要注意,JM速度非常的慢,是无法用于实际的

音频编码

音频编码的主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。音频编码也是互联网视音频技术中一个重要的技术。但是一般情况下音频的数据量要远小于视频的数据量,因而即使使用稍微落后的音频编码标准,而导致音频数据量有所增加,也不会对视音频的总数据量产生太大的影响。高效率的音频编码在同等的码率下,可以获得更高的音质。

音频编码的简单原理可以参考:视频压缩编码和音频压缩编码的基本原理

主要音频编码一览

名称 推出机构 推出时间 目前使用领域
AAC MPEG 1997 各个领域(新)
AC-3 Dolby Inc. 1992 电影
MP3 MPEG 1993 各个领域(旧)
WMA Microsoft Inc. 1999 微软平台

结果大致是这样的:AAC+ > MP3PRO > AAC> RealAudio > WMA > MP3

现有网络视音频平台对比

现有的网络视音频服务主要包括两种方式:点播和直播。点播意即根据用户的需要播放相应的视频节目,这是互联网视音频服务最主要的方式。绝大部分视频网站都提供了点播服务。直播意即互联网视音频平台直接将视频内容实时发送给用户,目前还处于发展阶段。直播在网络电视台,社交视频网站较为常见。

直播平台参数对比

现有网络视音频平台参数对比

名称 协议 封装 视频编码 音频编码
CNTV 私有
华数TV RTMP FLV H.264 AAC
六间房 RTMP FLV H.264 AAC
中国教育电视台 RTMP FLV H.264 AAC
北广传媒移动电视 RTMP FLV H.264 AAC
上海IPTV RTSP+RTP TS H.264 MP2

点播平台参数对比

现有互联网视音频平台参数对比

名称 协议 封装 视频编码 音频编码
CNTV HTTP MP4 H.264 AAC
CNTV(部分) RTMP FLV H.264 AAC
华数TV HTTP MP4 H.264 AAC
优酷网 HTTP FLV H.264 AAC
土豆网 HTTP F4V H.264 AAC
56网 HTTP FLV H.264 AAC
音悦台 HTTP MP4 H.264 AAC
乐视网 HTTP FLV H.264 AAC
新浪视频 HTTP FLV H.264 AAC

点播服务普遍采用了HTTP作为流媒体协议,H.264作为视频编码格式,AAC作为音频编码格式。采用HTTP作为点播协议有以下两点优势:一方面,HTTP是基于TCP协议的应用层协议,媒体传输过程中不会出现丢包等现象,从而保证了视频的质量;另一方面,HTTP被绝大部分的Web服务器支持,因而流媒体服务机构不必投资购买额外的流媒体服务器,从而节约了开支

USB摄像头基础知识

USB摄像头,通常指USB Web Camera,通过USB口与PC连接。

  • 通用的USB摄像头都是免驱摄像头(采用UVC驱动,UVC全称为USB Video Class,即:USB视频类,是一种为USB视频捕获设备定义的协议标准)。
  • 通常会有两种视频输出格式:YUV和MJPG。

两种格式的区别

  • YUV格式输出的是无压缩的视频帧(原始raw数据转换后得到YUV格式数据),系统资源占用少(因为不用解码),不需要解码器,缺点是帧率稍慢(受限于USB的带宽,USB 2.0速率是480Mbps,USB 3.0 速率是5Gbps)。YUV图像通常需要专用的图像查看工具才能打开,例如PYUV。
  • MJPG格式输出的是将视频图像采用JPEG格式压缩后得到的视频帧,优点是帧率高(视频开启快,曝光快),缺点是影像有马赛克,并且需要解码器,会占用PC系统资源。MJPG视频帧直接保存成jpg文件即可用常见的图片查看工具打开。

FFMPEG

ffmpeg是什么

• 一套开源软件
• 可以记录、转换音视频:可以从摄像头中记录视频,从声卡中记录音频,可以转换为各种格式,保存起来
• 还可以把各种格式的音视频,转换为流:供在线观看
• 其他功能:视频截图、加水印、裁剪等等
• Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音等视频频播放器的内核就是 FFmpeg
• 格式工厂的内核也是FFmpeg

ffmpeg原理理解

image-20240913133936811

MP4的理解:

Mp4只是一种封装格式,里面有音频数据,视频数据

  • 音频数据有自己的压缩格式,还不止一种
  • 视频数据也有自己的压缩格式,还不止一种

FFmpeg的组成

1、libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库;
2、libavcodec:用于各种类型声音/图像编解码
3、libavutil:包含一些公共的工具函数;
4、libswscale:用于视频场景比例缩放、色彩映射转换
5、libpostproc:用于后期效果处理
6、ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码;
7、ffsever:是一个HTTP多媒体实时广播流服务器,支持时光平移;
8、ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

以MP4转flv格式为例,需经过一下步骤

1
2
3
4
5
6
7
8
9
10
11
12
flowchart TD
A[MP4] -->|demux解复用| B(音频数据)
A --> |demux解复用|C(视频数据)
B -->|decode解码| D(原始音频数据)
C -->|decode解码| E(原始视频数据)
D-->|随意处理| D
E-->|随意处理| E
D -->|encode压缩|F(音频数据)
E -->|encode压缩|G(视频数据)
F -->|mux多路复用 |H(FLV)
G -->|mux多路复用 |H(FLV)

基础概念:

  • 容器(Container)

    容器就是一种文件格式,比如flv,mkv等。包含下面5种流以及文件头信息。

  • 流(Stream)

    是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。

  • 帧(Frame)

    帧代表一幅静止的图像,分为I帧,P帧,B帧。

  • 编解码器(Codec)

    是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode(解码)

  • 复用/解复用(mux/demux)

    把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)

    把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)

FFMpeg处理音视频的过程:

image-20240913143846873

安装

安装方式

  • 前往 FFmpeg 官方网站 FFmpeg.org
  • 在”Get packages & executable files”部分,选择 Windows 版本。
  • 在系统环境变量的PATH中添加 FFmpeg 的 bin 目录
  • ffmpeg -version验证安装是否成功

Csharp ffmpeg

参考链接

可以使用包FFmpeg.AutoGen

AutoGen只是封装调用FFmpeg,程序还是需要下在FFmpeg工具放在程序目录里,且版本要对应

FFmpeg.AutoGen的很多函数都是用到了指针,工程里要勾选允许不安全代

ffmpeg集成到程序目录下

直接将ffmpeg可执行文件放置到程序中就可以了
以下面的csharp调用为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
string _ffmpegPath = @"./ffmpeg.exe";
private void StartFFmpegProcess(string absolutePath)
{
string directory = Path.GetDirectoryName(absolutePath);
string fileName = Path.GetFileNameWithoutExtension(absolutePath);
string tempOutputPath = Path.Combine(directory, $"{fileName}_temp.mp4");

var arguments = $"-i \"{absolutePath}\" -c:v libx264 -preset slow -crf 26 -an \"{tempOutputPath}\"";

var processStartInfo = new ProcessStartInfo
{
FileName = _ffmpegPath,
Arguments = arguments,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
WorkingDirectory = directory
};

using (Process process = new Process { StartInfo = processStartInfo })
{
process.Start();
string error = process.StandardError.ReadToEnd();
process.WaitForExit();

if (process.ExitCode != 0)
{
Debug.WriteLine($"FFmpeg 执行失败。错误:{error}");
}
else
{
if (File.Exists(tempOutputPath))
{
File.Delete(absolutePath);
File.Move(tempOutputPath, absolutePath);
Debug.WriteLine("文件压缩并替换成功");
}
else
{
Debug.WriteLine("临时输出文件未找到");
}
}
}
}

FFmpeg的常用参数

主要参数 说明
-i 设置输入流
-f 设置输出格式
-ss 开始时间
视频参数 说明
-b 设置视频流量(码率),默认为200Kbit/s
-r 设置帧速率,默认为25
-s 设置画面的宽与高
-aspect 设置画面的比例
-vn 不处理视频
-vcodec 设置视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数 说明
-ar 设置采样率,通常使用的值是22050,44100,48000Hz
-ac 设置声音的通道数
-acodec 设置音频编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
-ab 音频比特率

详细参数参考

通用选项

  • -L license
  • -h 帮助
  • -fromats 显示可用的格式,编解码的,协议的…
  • -f fmt 强迫采用格式fmt
  • -I filename 输入文件
  • -y 覆盖输出文件
  • -t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持
  • -ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持
  • -title string 设置标题
  • -author string 设置作者
  • -copyright string 设置版权
  • -comment string 设置评论
  • -target type 设置目标文件类型(vcd,svcd,dvd) 所有的格式选项(比特率,编解码以及缓冲区大小)自动设置,只需要输入如下的就可以了:ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
  • -hq 激活高质量设置
  • -itsoffset offset 设置以秒为基准的时间偏移,该选项影响所有后面的输入文件。该偏移被加到输入文件的时戳,定义一个正偏移意味着相应的流被延迟了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持

视频选项

  • -b bitrate 设置比特率,缺省200kb/s
  • -r fps 设置帧频 缺省25
  • -s size 设置帧大小 格式为WXH 缺省160X128.下面的简写也可以直接使用:
  • Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
  • -aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
  • -croptop size 设置顶部切除带大小 像素单位
  • -cropbottom size –cropleft size –cropright size
  • -padtop size 设置顶部补齐的大小 像素单位
  • -padbottom size –padleft size –padright size –padcolor color 设置补齐条颜色(hex,6个16进制的数,红:绿:兰排列,比如 000000代表黑色)
  • -vn 不做视频记录
  • -bt tolerance 设置视频码率容忍度kbit/s
  • -maxrate bitrate设置最大视频码率容忍度
  • -minrate bitreate 设置最小视频码率容忍度
  • -bufsize size 设置码率控制缓冲区大小
  • -vcodec codec 强制使用codec编解码方式。如果用copy表示原始编解码数据必须被拷贝。
  • -sameq 使用同样视频质量作为源(VBR)
  • -pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
  • -passlogfile file 选择两遍的纪录文件名为file

高级视频选项

  • -g gop_size 设置图像组大小
  • -intra 仅适用帧内编码
  • -qscale q 使用固定的视频量化标度(VBR)
  • -qmin q 最小视频量化标度(VBR)
  • -qmax q 最大视频量化标度(VBR)
  • -qdiff q 量化标度间最大偏差 (VBR)
  • -qblur blur 视频量化标度柔化(VBR)
  • -qcomp compression 视频量化标度压缩(VBR)
  • -rc_init_cplx complexity 一遍编码的初始复杂度
  • -b_qfactor factor 在p和b帧间的qp因子
  • -i_qfactor factor 在p和i帧间的qp因子
  • -b_qoffset offset 在p和b帧间的qp偏差
  • -i_qoffset offset 在p和i帧间的qp偏差
  • -rc_eq equation 设置码率控制方程 默认tex^qComp
  • -rc_override override 特定间隔下的速率控制重载
  • -me method 设置运动估计的方法 可用方法有 zero phods log x1 epzs(缺省) full
  • -dct_algo algo 设置dct的算法 可用的有 0 FF_DCT_AUTO 缺省的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
  • -idct_algo algo 设置idct算法。可用的有 0 FF_IDCT_AUTO 缺省的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
  • -er n 设置错误残留为n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE
  • -ec bit_mask 设置错误掩蔽为bit_mask,该值为如下值的位掩码 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
  • -bf frames 使用frames B 帧,支持mpeg1,mpeg2,mpeg4
  • -mbd mode 宏块决策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
  • -4mv 使用4个运动矢量 仅用于mpeg4
  • -part 使用数据划分 仅用于mpeg4
  • -bug param 绕过没有被自动监测到编码器的问题
  • -strict strictness 跟标准的严格性
  • -aic 使能高级帧内编码 h263+
  • -umv 使能无限运动矢量 h263+
  • -deinterlace 不采用交织方法
  • -interlace 强迫交织法编码仅对mpeg2和mpeg4有效。当你的输入是交织的并且你想要保持交织以最小图像损失的时候采用该选项。可选的方法是不交织,但是损失更大
  • -psnr 计算压缩帧的psnr
  • -vstats 输出视频编码统计到vstats_hhmmss.log
  • -vhook module 插入视频处理模块 module 包括了模块名和参数,用空格分开

音频选项

  • -ab bitrate 设置音频码率
  • -ar freq 设置音频采样率
  • -ac channels 设置通道 缺省为1
  • -an 不使能音频纪录
  • -acodec codec 使用codec编解码

音频/视频捕获选项

  • -vd device 设置视频捕获设备。比如/dev/video0
  • -vc channel 设置视频捕获通道 DV1394专用
  • -tvstd standard 设置电视标准 NTSC PAL(SECAM)
  • -dv1394 设置DV1394捕获
  • -av device 设置音频设备 比如/dev/dsp

高级选项

  • -map file:stream 设置输入流映射
  • -debug 打印特定调试信息
  • -benchmark 为基准测试加入时间
  • -hex 倾倒每一个输入包
  • -bitexact 仅使用位精确算法 用于编解码测试
  • -ps size 设置包大小,以bits为单位
  • -re 以本地帧频读数据,主要用于模拟捕获设备
  • -loop 循环输入流(只工作于图像流,用于ffserver测试)

FFmpeg指令使用

FFmpeg 命令的典型语法是:

1
2
ffmpeg [全局选项] {[输入文件选项] -i 输入_url_地址} ...
{[输出文件选项] 输出_url_地址} ...

罗列一些常用的基本命令,详细可参考此处

  • 显示媒体文件细节 ffmpeg -i video.mp4

  • 转换视频文件到不同的格式 ffmpeg -i video.mp4 video.avi

    转化的时候如果想维持源文件的质量,可以使用-qscale 0参数

    使用指定编码转换:-vcodec libx264

  • 检查 FFmpeg 的支持格式的列表 ffmpeg -formats

  • 更改视频文件的分辨率 ffmpeg -i input.mp4 -s 1280x720 -c:a copy output.mp4

  • 压缩视频文件 ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4

  • 从视频文件中移除音频 ffmpeg -i input.mp4 -an output.mp4

  • 从媒体文件移除视频 ffmpeg -i input.mp4 -vn output.mp3

  • 裁剪一个视频文件的语法如下给定 ffmpeg -i input.mp4 -filter:v "crop=w:h:x:y" output.mp4

  • 视频文件中提取图像 ffmpeg -i input.mp4 -r 1 -f image2 image-%2d.png

  • 添加海报图像到音频文件 ffmpeg -loop 1 -i inputimage.jpg -i inputaudio.mp3 -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4

  • 切分视频文件为多个部分 ffmpeg -i input.mp4 -t 00:00:30 -c copy part1.mp4 -ss 00:00:30 -codec copy part2.mp4

  • 增加/减少视频播放速度 ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4

  • 去除音频并压缩视频文件 ffmpeg -i input.avi -c:v libx264 -preset slow -crf 26 -an output.mp4

    crf是个很重要的参数

    CRF(Constant Rate Factor,常量速率因子)是一个用于控制视频编码质量的参数,尤其是在使用 H.264 或 H.265 编码时

    • 0:无损编码,输出的视频质量极高,文件体积最大。使用此值时,编码器不会丢失任何信息,因此文件大小会非常大。

    • 18:被广泛认为是非常高的质量,适合需要高保真度的视频,例如专业视频制作。此时,文件大小相对较大,但质量非常好。

    • 20:通常被认为是高质量,适合大多数用户需求,文件大小和质量之间有良好的平衡。

    • 23:这是一个常用的选择,适合一般用途,能够提供合理的质量和较小的文件大小。

    • 24 到 28:随着 CRF 值的增加,视频质量逐渐下降,文件大小也会变小。适合对质量要求不高的场合,例如网络视频或低分辨率视频。

    • 51:最低质量,文件体积最小,几乎没有任何可用的视觉质量。

      特别留意的画质项:

    • 51 最低画质

    • 30 低画质

    • 24 中画质

    • 18 高画质

    • 12 肉眼无损

    • 0 无损

    p.s.ffmpeg输出文件与输入文件不能是同一个,需要转一手

  • 1

preset:

  • ultrafast:最快的编码速度,文件体积最大,质量最低。
  • superfast:比 ultrafast 稍慢,文件体积仍然较大。
  • veryfast:适用于快速编码,文件体积和质量之间有一定的平衡。
  • faster:速度稍慢,质量和压缩效果有所提升。
  • fast:适合大多数情况下的编码。
  • medium:默认设置,速度和质量之间的折中。
  • slow:编码速度较慢,但质量和压缩效果更好。
  • veryslow:非常慢的编码速度,通常用于需要最高质量的场合。
  • placebo:极慢的编码速度,几乎没有实际的质量提升,主要用于实验和测试。

摄像头监控方案盘点

  • MJPG-streamer方案 适合低性能的开发板
  • 流媒体方案

MJPG-streamer

优点:
• 程序简单,所有源码一目了然,便于学习
• 对ARM板的性能要求不高,主频200MHz的ARM芯片也能实现
缺点:
• 只能实现局域网内的视频监控
• 要实现互联网视频监控,需要另外实现内网穿透
• mjpg-streamer没有实现声音传输
• mjipg-streamed目已经不再维护,仅仅建议用于学习

流媒体方案

流媒体方案是主流的视频监控方案

image-20240913105309045

推流端 =RTMP协议=> 流媒体服务器 =RTMP/httpflv/hls协议=> 拉流端

全部使用开源方案可以

  • 推流端: 使用ffmpeg
  • 流媒体服务器: 使用nginx
  • 拉流端: 使用浏览器/VLC播放器

MJPG-streamer方案详解

开源地址

格式理解

JPEG

可以理解为一个原始图片的压缩格式

  • 简称JPG

  • 上过美术课的人都知道一个像素的颜色可以用RGB三原色来表示,其实还可以用YUV格式来表示

  • 使用RGB、YUV的格式编码的照片,文件都很大,比如常见的BMP文件就是用RGB编码

  • 把一个BMP文件转换为JPEG文件,可以发现图片质量没发生变化,但是文件变小了很

    JPEG是根据人体视觉的特点采用了YCbCr格式,大大压缩了照片的大小

MJPG

  • Motion JPEG,简称MJPG
  • JPEG是静态图片的编码格式,MUJPG是动态的视频编码格式
  • 可以简理解:MJPG就是把多个JPEG图片连续显示出[来

优点:

  • 很多摄像头本身就支持JPEG、MJPG,所以处理器不需要做太多处理
  • 一般的低性能处理器就可以传输MJPG视频流

缺点:

MJPG只是多个JPEG图片的组合,它不考虑前后两帧数据的变化,总是传输一帧帧图像:传输带宽要求高

H264等视频格式,会考虑前后两帧数据的变化,只传输变化的数据:传输带宽要求低

用法

1
mjpg_streamer -i "/usr/lib/mjpg-streamer/input_uvc.so -d /dev/video1 -f 30 -q 90 -n" -o "/usr/lib/mjpg-streamer/output_http.so -w /usr/share/mjpg-streamer/www"

该指令内部实现原理:

image-20240913112015644

1
2
3
4
5
6
7
#查看帮助
mjpg_streamer -o "/usr/lib/mjpg-streamer/output_file.so --help"
mjpg_streamer -i "/usr/lib/mjpg-streamer/input_file.so --help"
#把摄像头数据存为jpg文件
mjpg_streamer -i "/usr/lib/mjpg-streamer/input_uvc.so -d /dev/video1 -f 30 -q 90 -n" -o "/usr/lib/mjpg-streamer/output_file.so -f /tmp"
#把jpg文件输出到浏览器
mjpg_streamer -i "/usr/lib/mjpg-streamer/input_file.so -e -f /tmp" -o "/usr/lib/mjpg-streamer/output_http.so -w /usr/share/mjpg-streamer/www"

流媒体方案详解

推流端

职责: 采集数据,并转换格式,再推送给流媒体服务器

摄像头访问技术:

  • DirectShow (Windows): 这是 Windows 平台上常用的多媒体 API,可以用于访问摄像头设备并获取视频数据。
  • OpenCV (跨平台): 这是一个开源的计算机视觉库,提供了多种摄像头访问和视频处理功能。
  • FFmpeg (跨平台): 这是一个强大的多媒体处理库,可以用于视频录制、解码和流传输。

推流端: FFmpeg使用RTMP协议向Nginx推流,或rtsp-simple-server(但他不支持MJPG编码格式)

拉流端: 浏览器使用HTTPFLV协议从Nginx拉流(安装flv.js)

FFmpeg从/dev/video1中得到摄像头数据,一秒10帧,质量是10,把他以RTMP协议推送到本地服务器,可以执行命令ffmpeg -f v4|2 -framerate 10 -i /dev/video1 -q 10 -f flv rtmp://127.0.0.1/live/wei

windows捕获视频流

windows捕获音视频流:Media Foundation

全平台捕获视频流可以使用qt的库

USB摄像头监控保存方案记录

使用opencv捕获的摄像头数据通过输入端传递给ffmpeg压缩后保存为文件

优化夜间视觉效果

在算法上优化夜间视觉效果可以通过以下几种方法实现:

  1. 图像增强:使用图像增强技术,如直方图均衡化(Histogram Equalization)和自适应直方图均衡化(CLAHE),可以提高图像的对比度,使暗部细节更加明显。
  2. 去噪声处理:夜间拍摄通常会引入噪声,使用去噪算法(如高斯滤波、中值滤波或更先进的深度学习去噪算法)可以减少噪声对图像质量的影响。
  3. 多帧合成:通过将多张低曝光的图像合成一张高质量图像,可以有效提升图像的亮度和细节。这种方法常用于长时间曝光摄影中。
  4. 图像锐化:在低光条件下,图像可能显得模糊,通过锐化算法(如拉普拉斯锐化或Unsharp Mask)可以提高图像的清晰度。
  5. 深度学习技术:利用深度学习模型(如卷积神经网络)进行低光图像增强,可以自动学习和提升图像在低光环境下的表现。
  6. 色彩校正:在夜间拍摄中,色彩可能会失真,通过色彩校正算法可以恢复图像的真实色彩。

视频播放

可以使用libVLCSharp和libVLCSharp.WPF

还要安装VideoLAN.LibVLC.Windows