本文会介绍一些 FFmpeg 的常用命令(也蕴含 FFplay,FFprobe)。笔者在一开始接触 FFmpeg 时也是从网上找一些文章来看,但都是零零散散,也不知为什么是这个命令,最近为了实现一些工作啃了啃 FFmpeg 的文档,总结了一些罕用且实用的命令。
浏览之前
本文介绍的内容不是从零开始的,不会教你去装置,也不会特地难,然而有点长。倡议浏览本文之前浏览一下以下 2 篇文章:
- 【必看】阮一峰——FFmpeg 视频解决入门教程
- 又拍云——看视频常见的 720p、1080p、4k,这些分辨率到底蕴含了什么?
对于音视频的格局
如何查看一个媒体文件的详细信息
ffprobe 是一个用来收集媒体文件信息的工具,能够以指定的格局打印出媒体文件信息。你能够用 ffprobe 查看视频,音频甚至是一张图片的信息。
ffprobe -loglevel quiet -of json -show_format -show_streams video.webm
ffprobe -v quiet -of json -show_format -show_streams video.webm
ffprobe -v 8 -of json -show_format -show_streams video.webm
# -v = -loglevel 日志的级别,罕用的参数就是 -v quiet / -v 8,这样就能够取得一个比拟洁净的输入。# -of = -print_format 输入的格局,json 应该算是可读性比拟高的,也能够抉择 xml, csv 等。# -show_format 打印格局信息
# -show_streams 打印流信息
拓展:如何比拟两个文件的差别
这里会用到 vimdiff,如果会用 vim 的同学能够尝试一下。
vimdiff 的根本用法是:
vimdiff file1 file2
所以比拟两个媒体文件的差别还是比较简单的:
vimdiff <(ffprobe -v quiet -of json -show_format -show_streams video1.mp4) <(ffprobe -v quiet -of json -show_format -show_streams video2.mp4)
罕用的音视频格局
阮一峰老师的文章中讲的不错,不再赘述。
罕用的视频分辨率
FFmpeg 官网中提供了一组分辨率的值:
分辨率名称 | 分辨率(宽 x 高) |
---|---|
hd480 | 852 x 480 |
hd720 | 1280 x 720 |
hd1080 | 1920 x 1080 |
2k | 2048 x 1080 |
4k | 4096 x 2160 |
也有一些文章中提到另外一组分辨率的值:
分辨率名称 | 分辨率(宽 x 高) |
---|---|
SD (Standard Definition) | 720 x 576 |
HD (High Definition) | 1280 x 720 |
Full-HD (High Definition / 2K) | 1920 x 1080 |
UHD (Ultra High Definition) | 3840 x 2160 |
4K (Hi-Vision System (HV)) | 4096 × 2160 |
8K (Super Hi-Vision System (SHV)) | 7680 × 4320 |
其实不用太纠结,个别用视频高度就能够了,本文中前面的解决也是这样做的。
罕用的音频采样率
目前比拟罕用的 44,100 Hz 和 48,000 Hz,即 44.1k 和 48k。
- 22,050 Hz – 无线电播送所用采样率
- 44,100 Hz – 音频 CD, 也罕用于 MPEG- 1 音频(VCD, SVCD, MP3)所用采样率
- 48,000 Hz – miniDV、数字电视、DVD、DAT、电影和业余音频所用的数字声音所用采样率
- 96,000 或者 192,000 Hz – DVD-Audio、一些 LPCM DVD 音轨、Blu-ray Disc(蓝光光盘)音轨、和 HD-DVD(高清晰度 DVD)音轨所用所用采样率
个别转码
终于进入正题,开始划重点:
$ ffmpeg \
[全局参数] \
[输出文件参数] \
-i [输出文件] \
[输入文件参数] \
[输入文件]
这个命令构造是从阮一峰老师那里拿过去的,对于个别的转码这个命令构造曾经够用了。实际上,ffmpeg 反对多个输出,多个输入(这里有个印象就好)。
格局的变换
ffmpeg -i video.webm video.mp4
ffmpeg -y -v quiet -i video.webm video.mp4
将 webm 格局的视频转换成 mp4。很简略是不是。
# -y 示意输入后果文件存在时间接笼罩,不会询问
# -n 示意输入后果文件存在时终止转换
# -v 后面说过,是日志级别,-v quiet 就是什么也不输入,包含 banner
# -hide_banner 能够不输入 banner
加一些参数,指定音频编码,视频编码
ffmpeg -i video.webm -c:a aac -c:v h264 video.mp4
# -c = -codec 指定编码器
# -c:a 指定音频编码 -c:a aac 指定音频为 aac
# -c:v 指定视频编码 -c:v h264 指定视频为 h264
# -c:a copy 间接复制 音频编码
# -c:v copy 间接复制 视频编码
# -c copy 间接复制音频视频编码
分辨率的变换
指定分辨率
ffmpeg -i video.mp4 -vf scale=1280:720 video_1280_720.mp4
ffmpeg -i video.mp4 -vf scale=852:480 video_852_480.mp4
# -vf = -filter:v 这个参数在前面还要用到很屡次
当然还能够只指定宽或者高,而对应的高或者宽主动计算出来
ffmpeg -i video.mp4 -vf scale=-1:720 video_1280_720.mp4
ffmpeg -i video.mp4 -vf scale=1280:-1 video_1280_720.mp4
-1 就示意这个值是缺省值,能够主动计算出来
YUV 编码的坑 -1 与 -2
然而这里有个坑,就是 yuv 编码中,分辨率必须是偶数。所以当缺省的宽或者高计算出来是一个奇数的话,就会报错。这个时候咱们能够应用 - 2 来代替 -1,这样计算出来的后果会取偶数,实际上,我更举荐从一开始就用 -2。
# 比方原始分辨率是 1920 * 1080
ffmpeg -i video.mp4 -vf scale=-1:480 video_480.mp4
# 应用 -1 计算就会报错,因为算进去的是 853 * 480
ffmpeg -i video.mp4 -vf scale=-2:480 video_480.mp4
# 应用 -2 计算就不会报错,因为算进去的是 852 * 480
其余参数的变换
音频能够调整的参数:音频编码、音频声道数、音频采样率、音频码率
视频能够调整的参数:视频编码、视频码率、视频分辨率、视频每秒帧数
对于码率,有一篇文章《如何计算视频最佳码率》能够参考一下,集体不太懂,如果有懂的能够举荐一下。
ffmpeg -i video.webm -c:a aac -ac 2 -ar 48000 -b:a 128k -c:v h264 -b:v 1000k -vf 'scale=1920:1080,fps=30' video.mp4
-c:a aac 指定音频编码 aac
-ac 2 声道双声道
-ar 48k 采样率
-b:a 128k = -ab 128k 指定音频码率,举荐应用 -b:a
-c:v h264 指定视频编码 h264
-b:v 128k = -vb 1000k 指定视频频码率,举荐应用 -b:v
-vf 'scale=1920:1080,fps=30' 指定分辨率 每秒帧数
合并视频 / 拼接视频
合并视频 / 拼接视频要求视频适合尽可能统一,否则合成的视频可能会无奈播放。
罕用的形式是将须要拼接的视频文件门路写入一个文件,而后用 FFmpeg concat 办法拼接:
echo "file $PWD/video-1.mp4" >> videos.txt
echo "file $PWD/video-2.mp4" >> videos.txt
echo "file $PWD/video-3.mp4" >> videos.txt
ffmpeg -f concat -safe 0 -i videos.txt -c copy video-concat-123.mp4
当然通过 Linux 命令的技巧是能够写成一个命令的:
ffmpeg -f concat -safe 0 -i <(echo "file $PWD/video-1.mp4"; echo "file $PWD/video-2.mp4"; echo "file $PWD/video-3.mp4";) -c copy video-concat-123.mp4
合并视频也是能够进行转码的
ffmpeg -f concat -safe 0 -i <(echo "file $PWD/video-1.webm"; echo "file $PWD/video-2.webm"; echo "file $PWD/video-3.webm";) -c:a aac -c:v h264 video-concat-123.mp4
前面会提到如何给拼接并转码成 HLS 格局的视频
音频加图片变成视频
ffmpeg -loop 1 -i cover.jpg -i input.mp3 -c:v libx264 -c:a aac -b:a 192k -shortest output.mp4
下面命令中,有两个输出文件,一个是封面图片 cover.jpg
,另一个是音频文件 input.mp3
。-loop 1
参数示意图片有限循环,-shortest
参数示意音频文件完结,输入视频就完结。
增加水印
给视频增加水印可真是个比拟麻烦的事件,这里也仅仅是列出了一些比拟罕用的类型,触类旁通加浏览文档就能够了。
一个图片水印,一个地位
这种算是比较简单的了
ffmpeg -i video.mp4 -vf "movie=watermark.png,scale=100:100[logo];[in][logo]overlay=main_w-overlay_w-10:10[out]" video-logo-01.mp4
ffmpeg -i video.mp4 -vf "movie=watermark.png,scale=128:128[logo];[in][logo]overlay=W-w-50:50[out]" video-logo-02.mp4
ffmpeg -i video.mp4 -vf "movie=watermark.png,scale=128:128[logo];[in][logo]overlay=W-w-50:H-h-50[out]" video-logo-03.mp4
这里用到了后面用过的 -vf 参数
movie=watermark.png,scale=100:100[logo]
# scale 示意 这个图片会被缩放到 100 x 100 的大小
这个示意我输出一个图片,我把他叫做 logo
[in][logo]overlay=main_w-overlay_w-10:10[out]
这个示意 我用在输出 [in] 上增加 logo,增加的地位为 overlay=main_w-overlay_w-10:10
这里须要解释:overlay=x=50:y=50 这示意给 logo 设置一个地位,这里的 x 和 y 能够省略,即
overlay=50:50
这示意视频左上角坐标为 (0, 0), 向右,向下 50 像素。
而 main_w 和 W 一样示意 视频的宽度,main_h 和 H 一样示意视频高度,overlay_w-10 和 w-10 一样,示意横向的偏移量,overlay_h-10 和 h-10 一样 示意纵向的偏移量。
overlay=W-w-50:50 就示意,视频左上角坐标为 (0, 0), 向右 视频宽度减去偏移量 50 的像素,向下 50 像素,即从右上角向左向下 50 像素。
同理:
# 左上角
overlay=50:50
# 右上角
overlay=W-w-50:50
# 左下角
overlay=50:H-h-50
# 右下角
overlay=W-w-50:H-h-50
一个图片水印,多个地位变换
这里给出一个例子,一个 logo 三个地位交替呈现,读懂须要一点编程的思维
ffmpeg -i video.mp4 -vf "movie=watermark0.png,scale=80:80[watermark0];movie=watermark0.png,scale=80:80[watermark1];movie=watermark0.png,scale=80:80[watermark2];[in][watermark0]overlay=x='if(gte(mod(t,30),0)*lt(mod(t,30),10),W-w-80,NAN)':y=80[tmp],[tmp][watermark1]overlay=x='if(gte(mod(t,30),10)*lt(mod(t,30),20),80,NAN)':y=80[tmp],[tmp][watermark2]overlay=x='if(gte(mod(t,30),20)*lt(mod(t,30),30),W-w-80,NAN)':y=H-h-80[out]" video-watermark.mp4
这里输出的一张图片被分成了三个输出 watermark0 watermark1 watermark2
逻辑是在 0-10 秒显示 watermark0, 10-20 秒显示 watermark1, 20-30 秒显示 watermark2
这个工夫能够本人定义,用到的是 ffmpeg 中 if gte lt mod 等运算符,和默认的工夫 t
两头的输入用 tmp 示意,同时也作为下一个水印的输出。
多个图片水印,变换
有了下面的例子,上面这个应该好了解了
# 三个 logo 交替呈现
ffmpeg -i video.mp4 -vf "movie=watermark0.png,scale=150:150[watermark0];movie=watermark1.png,scale=150:150[watermark1];movie=watermark3.png,scale=150:150[watermark2];[in][watermark0]overlay=x='if(gte(mod(t,30),0)*lt(mod(t,30),10),W-w-80,NAN)':y=80[tmp],[tmp][watermark1]overlay=x='if(gte(mod(t,30),10)*lt(mod(t,30),20),W-w-80,NAN)':y=80[tmp],[tmp][watermark2]overlay=x='if(gte(mod(t,30),20)*lt(mod(t,30),30),W-w-80,NAN)':y=80[out]" video-watermark.mp4
这里输出的三张图片别离为 watermark0 watermark1 watermark2
跑马灯
跑马灯水印实际上就是图片地位 x,y 随着工夫 t 的变动,能够写成函数
# 从左到右
ffmpeg -i video.mp4 -vf "movie=watermark0.png,scale=128:128[logo];[in][logo]overlay=x='mod(t*20,W)':50[out]" video-logo.mp4
ffmpeg -i video.mp4 -vf "movie=watermark0.png,scale=128:128[logo];[in][logo]overlay=x='mod(t*20,W+128)-128':50[out]" video-logo.mp4
# 从左上到右下
ffmpeg -i video.mp4 -vf "movie=watermark0.png,scale=128:128[logo];[in][logo]overlay=x='mod(t*20,W)':y='mod(t*20,H)'[out]" video-logo.mp4
ffmpeg -i video.mp4 -vf "movie=watermark0.png,scale=128:128[logo];[in][logo]overlay=x='mod(t*20,W+128)-128':y='mod(t*20,H+128)-128'[out]" video-logo.mp4
半透明水印
ffmpeg -i video.mp4 -vf "movie=watermark0.png,scale=128:128,colorkey=0x000000:0.6:1.0[logo];[in][logo]overlay=W-w-50:50[out]" video-logo.mp4
文字水印
ffmpeg -i video.mp4 -vf "drawtext=fontfile=simhei.ttf:text='Github is Great!':x='mod(t*20,W)':y='mod(t*10,H)':fontsize=24:fontcolor=white:shadowy=2" video-watermark-text.mp4
ffmpeg -i video.mp4 -vf "drawtext=text='Github is Great!':x='mod(t*20,W)':y='mod(t*10,H)':fontsize=24:fontcolor=white:shadowy=2" video-watermark-text.mp4
ffmpeg -i video.mp4 -vf "drawtext=fontfile=SourceHanSerifCN-Regular.otf:text='GitHub 真棒 ':x='mod(t*20,W)':y='mod(t*10,H)':fontsize=24:fontcolor=white:shadowy=2" video-watermark-text.mp4
ffmpeg -i video.mp4 -vf "drawtext=fontfile=SourceHanSerifCN-Regular.otf:text=' 这个水印真厉害!!!哈哈哈!!!':x='mod(t*20,W)':y='mod(t*10+470,H)':fontsize=24:fontcolor=white:shadowx=2:shadowy=2" video-watermark-text.mp4
- fontfile 字体文件,如果水印内容蕴含中文,须要中文字体
- text 水印内容
- fontsize 字体大小
- fontcolor 字体色彩
- shadowx、shadowy 暗影
图片和文字水印并存
ffmpeg -i video.mp4 -vf "movie=watermark0.png,scale=150:150[watermark0];movie=watermark2.png,scale=150:150[watermark1];[in][watermark0]overlay=x='if(lt(mod(t,20),10),50,NAN)':y=50[tmp],[tmp][watermark1]overlay=x='if(gt(mod(t,20),10),W-w-50,NAN)':y=50[tmp],[tmp]drawtext=fontfile=simhei.ttf:text='Github is Great!':x='mod(t*20,W)':y='mod(t*10,H)':fontsize=24:fontcolor=white:shadowx=2:shadowy=2[out]" video-watermark.mp4
切片(转 HLS)
对于 m3u8 文件
M3U8 文件是指 UTF- 8 编码格局的 M3U 文件。M3U 文件是记录了一个索引纯文本文件,关上它时播放软件并不是播放它,而是依据它的索引找到对应的音视频文件的网络地址进行在线播放。
M3U 是一种播放多媒体列表的文件格式,它的设计初衷是为了播放音频文件,比方 MP3,然而越来越多的软件当初用来播放视频文件列表,M3U 也能够指定在线流媒体音频源。很多播放器和软件都反对 M3U 文件格式。
拓展:一个下载视频的小技巧
youtube-dl
间接转码切片
ffmpeg -i video.webm -c:a aac -ac 2 -c:v h264 -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_playlist_type vod -hls_flags 'split_by_time+append_list' -hls_time 15 -hls_segment_filename "hls/%06d.ts" hls/index.m3u8
这个命令外面有太多的参数了,实际上平时不会用到这么多。
后面讲过 -c:a aac -ac 2 -c:v h264 是指定音视频格局的参数,实际操作中,如果 音频编码是 aac,视频编码是 h264 能够间接应用 -c copy 参数,不扭转编码,放慢切片速度。
- -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb 转换 HLS 或者 MP4 或者 FLV 时最好加上这两个选项
- -f hls 指定格局为 hls
- -hls_playlist_type vod 指定视频为点播 同时会默认设置 -hls_list_size 0,点播的 m3u8 索引中 ts 数目不限度
- -hls_flags ‘split_by_time+append_list’ 默认状况下,切片时长可能会长短不齐,split_by_time 能够使工夫尽可能的雷同,append_list 是以追加的形式增加在 m3u8 文件开端,这也是拼接 HLS 视频的一种形式
- -hls_time 15 每个切片的长度
- -hls_segment_filename “hls/%06d.ts” 切片的文件名 %06d 示意 6 位数字,从 0 开始,后面有余补 0
切片输入不同分辨率
ffmpeg -i video.mp4 -c copy -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_playlist_type vod -hls_flags 'split_by_time+append_list' -hls_time 15 "hls/1080/%06d.ts" hls/1080/index.m3u8
ffmpeg -i video.mp4 -vf scale=1280:720 -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_playlist_type vod -hls_flags 'split_by_time+append_list' -hls_time 15 -hls_segment_filename "hls/720/%06d.ts" hls/720/index.m3u8
ffmpeg -i video.mp4 -vf scale=852:480 -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_playlist_type vod -hls_flags 'split_by_time+append_list' -hls_time 15 -hls_segment_filename "hls/480/%06d.ts" hls/480/index.m3u8
同时输入多种分辨率
ffmpeg -i video.mp4 \
-c copy -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_playlist_type vod -hls_flags 'split_by_time' -hls_time 15 -hls_segment_filename "hls/1080/%06d.ts" hls/1080/index.m3u8 \
-vf scale=-2:720 -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_playlist_type vod -hls_flags 'split_by_time' -hls_time 15 -hls_segment_filename "hls/720/%06d.ts" hls/720/index.m3u8 \
-vf scale=-2:480 -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_playlist_type vod -hls_flags 'split_by_time' -hls_time 15 -hls_segment_filename "hls/480/%06d.ts" hls/480/index.m3u8
同时输入多种分辨率的另一种办法
ffmpeg -i video.mp4 \
-filter_complex "[v:0]split=3[vtemp001][vtemp002][vout1080];[vtemp001]scale=w=1280:h=720[vout720];[vtemp002]scale=w=852:h=480[vout480]" \
-bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_playlist_type vod -hls_flags 'split_by_time' \
-hls_time 15 hls/multi/%06d_%v.ts \
-map "[vout1080]" \
-map "[vout720]" \
-map "[vout480]" \
-map a:0 \
-map a:0 \
-map a:0 \
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" \
-master_pl_name index.m3u8 \
hls/multi/index_%v.m3u8
截取指定时长切片(试看性能)
ffmpeg -ss 0 -t 300 -i video.webm -c:a aac -ac 2 -c:v h264 -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_playlist_type vod -hls_flags 'split_by_time' -hls_time 15 -hls_segment_filename "hls/%06d.ts" hls/index.m3u8
-ss 0 -t 300 示意从 0 秒开始,-t 时长
多个视频合并成一个视频切片
ffmpeg -f concat -safe 0 -i <(echo "file $PWD/video-1.mp4"; echo "file $PWD/video-2.mp4"; echo "file $PWD/video-3.mp4";) -c copy -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_playlist_type vod -hls_flags 'split_by_time' -hls_time 15 -hls_segment_filename "hls/%06d.ts" hls/index-123.m3u8
这种拼接办法在不同格局视频(不同分辨率,码率,采样率)时可能会呈现谬误,
能够采纳另一种办法转换 HLS
# 应用追加的模式 append_list
ffmpeg -y -hide_banner -i video.webm -c:a aac -c:v h264 -vf 'scale=720:-2' -movflags faststart -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_playlist_type vod -hls_flags 'split_by_time+append_list' -hls_time 10 -hls_segment_filename hls/%d.ts hls/index.m3u8
ffmpeg -y -hide_banner -i video.mp4 -c:a aac -c:v h264 -vf 'scale=720:-2' -movflags faststart -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_playlist_type vod -hls_flags 'split_by_time+append_list' -hls_time 10 -hls_segment_filename hls/%d.ts hls/index.m3u8
ffmpeg -y -hide_banner -i video.mp4 -c:a aac -c:v h264 -vf 'scale=720:-2' -movflags faststart -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_playlist_type vod -hls_flags 'split_by_time+append_list' -hls_time 10 -hls_segment_filename hls/%d.ts hls/index.m3u8
切片的加密(转 HLS 加密)
HLS 加密须要一个密钥 key,一个初始向量 iv
openssl rand 16 > enc.key
touch enc.keyinfo
echo "https://example.com/enc.key" > enc.keyinfo
echo "enc.key" >> enc.keyinfo
echo $(openssl rand -hex 16) >> enc.keyinfo
ffmpeg -y -i video.mp4 -c copy -bsf:a aac_adtstoasc -bsf:v h264_mp4toannexb -f hls -hls_key_info_file enc.keyinfo -hls_playlist_type vod -hls_flags 'split_by_time' -hls_time 15 -hls_segment_filename "hls-encrypted/%6d.ts" video-encrypted.m3u8
openssl rand 16 生成的是一个乱码的字符串 openssl rand -hex 16 输入的是转成 16 进制的字符串
如果要存储密钥和向量能够都用 16 进制,在 Java 里能够这样写:
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.RandomUtils;
import java.nio.charset.StandardCharsets;
// 用于存储在数据库中
String key = new String(Hex.encodeHex(RandomUtils.nextBytes(16)));
String iv = new String(Hex.encodeHex(RandomUtils.nextBytes(16)));
// 用于转码时应用
File encKeyFile = new File("enc.key");
File encKeyInfoFile = new File("enc.keyinfo");
FileUtils.writeByteArrayToFile(encKeyFile, Hex.decodeHex(key));
FileUtils.writeStringToFile(encKeyInfoFile, "https://example.com/enc.key\n", StandardCharsets.UTF_8, false);
FileUtils.writeStringToFile(encKeyInfoFile, "enc.key\n", StandardCharsets.UTF_8, true);
FileUtils.writeStringToFile(encKeyInfoFile, iv + "\n", StandardCharsets.UTF_8, true);
用到的一些包:
// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
implementation("org.apache.commons:commons-lang3:3.11")
// https://mvnrepository.com/artifact/commons-io/commons-io
implementation("commons-io:commons-io:2.7")
// https://mvnrepository.com/artifact/commons-codec/commons-codec
implementation("commons-codec:commons-codec:1.14")
截取图片
ffmpeg -i video.mp4 -ss 100 -vframes 1 -q:v 1 pic/video_pic_100.png
- -ss 截取工夫,能够是小数
- -vframes 截取几张图片
- -q:v 图片的品质 我测试 png 没有成果,jpg 才有成果
参考资料
- ffmpeg-all
- ffplay-all
- ffprobe-all
- Separating SD, HD, Full HD, 4K and 8K
- [[编码解码] 对于 AES 加解密中 CBC 模式的 IV 初始化向量的安全性问题 ](https://www.cnblogs.com/0616-…
- 如何计算视频最佳码率