01它到底是什么
FFmpeg 不是一个程序,而是一套命令行工具加上一堆编解码库。装完一般有三个可执行文件,各干一件事:
干活的主力。转码、剪切、合并、加滤镜、录屏、推流,都在它身上。
只读不写。把时长、码率、分辨率、帧率、每条流的编码打印出来。动文件之前先跑它。
极简播放器。用来快速确认「这段剪对了没」「这个滤镜效果对不对」,不用打开大软件。
它不是剪辑软件:没有时间线、没有预览窗、撤销只能重跑命令。它的强项是可脚本化——一条命令能套在几百个文件上跑,也能挂在服务器上 7×24 小时干活。
ffprobe,能省掉一半的试错。绝大多数「转出来不对」,都是因为没看清源里到底装了什么。02安装与自检
# macOS
brew install ffmpeg
# Debian / Ubuntu
sudo apt update && sudo apt install -y ffmpeg
# Windows
winget install --id Gyan.FFmpeg -e
# Linux 免 root 静态构建(下载即用,不依赖系统库)
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
tar xf ffmpeg-release-amd64-static.tar.xz && sudo cp ffmpeg-*-static/ffmpeg /usr/local/bin/
发行版自带的 ffmpeg 版本可能偏旧(Ubuntu 22.04 是 4.4)。要用新编码器(如 SVT-AV1)就上静态构建或自己编译。Windows 装完需重开终端,让 PATH 生效。
ffmpeg -version # 版本 + 编译选项(--enable-xxx 决定你能用什么)
ffmpeg -encoders # 本机可用的编码器
ffmpeg -decoders # 本机可用的解码器
ffmpeg -formats # 支持的容器/协议
ffmpeg -hwaccels # 可用的解码硬件加速
ffmpeg -filters # 可用的滤镜
ffmpeg -h encoder=libx264 # 某个编码器的全部参数
最常查的一条:ffmpeg -encoders | grep -E '264|265|av1|nvenc|videotoolbox|qsv|vaapi|aac|opus'。列表里没有的名字,命令里写了也会报 Unknown encoder。
03四个概念:容器、编码、流、滤镜
这四个词混在一起,是 FFmpeg 让人懵的主因。分开看:
| 概念 | 是什么 | 例子 |
|---|---|---|
| 容器 muxer | 装东西的盒子,决定后缀名和能不能装某种流 | mp4、mkv、mov、webm、ts、flv |
| 编码 codec | 里面画和声的压缩方式 | H.264、H.265/HEVC、AV1、VP9、AAC、Opus、MP3 |
| 流 stream | 一条独立的视频 / 音频 / 字幕轨道 | 0:v:0(第一个输入的第 1 路视频) |
| 滤镜 filter | 在解码后、编码前对画面或声音做的处理 | scale、crop、overlay、atempo |
盒子和内容是分开选的:同一个 H.264 视频可以装进 MP4,也可以装进 MKV。「MKV 转 MP4」往往只是换个盒子,几分钟的活几秒就完;而「H.264 转 H.265」才是真正的重压缩。
- 拷贝(-c copy):流原样搬过去,不解码不编码,快、无损、无画质损失。
- 重编码:解码 →(可选滤镜)→ 新编码器压缩。画质、体积、兼容性都在这一步决定,也最耗 CPU。
- 只要用了
-vf/-af/-filter_complex,那一流就必须重编码,copy会失效。
04命令结构与流选择
ffmpeg [全局选项] [输入选项] -i 输入 [输出选项] 输出
位置决定含义:写在 -i 前面的是输入选项(作用于读文件),写在 后面的是输出选项(作用于写文件)。同一个选项放错位置,行为完全不同——最典型的是 -ss。
- 输出文件可以有多个:
ffmpeg -i in.mp4 -c:v libx264 -crf 23 big.mp4 -vf scale=640:-2 small.mp4 - 流选择用
-map,不写时 FFmpeg 会为每种类型挑「它认为最好的」一条。多音轨成片请显式写-map。 - 流限定符:
-c:v视频、-c:a音频、-c:s字幕、-c:v:0第 1 路视频。只写-c表示所有类型。
-y # 存在就覆盖(脚本里必加,否则会卡住等你输入)
-n # 存在就退出,不覆盖
-hide_banner # 不打印编译信息,日志更干净
-loglevel error|warning|info|verbose|debug
-stats # 显示进度(默认开);-nostats 关掉
-nostdin # 循环里必加:防止 ffmpeg 吃掉脚本的标准输入
-benchmark # 跑完打印耗时,用来对比预设
# 第 1 路视频 + 第 2 路音频(下标从 0 开始,所以是 0:a:1)
ffmpeg -y -i in.mkv -map 0:v:0 -map 0:a:1 -c copy out.mp4
# 全部流,但排除字幕
ffmpeg -y -i in.mkv -map 0 -map -0:s -c copy out.mp4
# 全部流;没有字幕也不报错(问号 = 可选)
ffmpeg -y -i in.mkv -map 0:v -map 0:a -map 0:s? -c copy out.mkv
05ffprobe:先看清素材
# 人读
ffprobe -hide_banner in.mp4
# 机器读(脚本里用)
ffprobe -v error -show_format -show_streams -of json in.mp4
# 只要某几项
ffprobe -v error -select_streams v:0 \
-show_entries stream=codec_name,width,height,r_frame_rate,pix_fmt \
-of default=noprint_wrappers=1 in.mp4
# 只要时长(秒)
ffprobe -v error -show_entries format=duration -of csv=p=0 in.mp4
盯这几项就够了:
| 字段 | 看它干嘛 |
|---|---|
| codec_name | 已经是 h264 + aac 且目标也是 MP4,多半只要 -c copy |
| width / height | H.264 的 yuv420p 要求宽高都是偶数,奇数边缩放要用 -2 |
| pix_fmt | yuv420p 最通用;10-bit 的 yuv420p10le 很多播放器不认 |
| r_frame_rate | 30000/1001 就是 29.97,别随手改成 30 |
| bit_rate | 目标码率别超过源,压不出更好的画质,只会更大 |
| codec_type 出现多次 | 多音轨 / 多字幕,需要 -map 指定留哪条 |
06ffplay:快速预览
ffplay in.mp4 # 直接播
ffplay -ss 00:01:20 in.mp4 # 从 1 分 20 秒开始
ffplay -vf "crop=640:360:0:0" in.mp4 # 边播边看滤镜效果
ffplay -nodisp -autoexit music.mp3 # 不看画面,播完自动退出
ffplay -f lavfi "testsrc=size=640x360:rate=30" # 生成测试画面
- 快捷键:
空格暂停、← / →快退快进 10 秒、↓ / ↑1 分钟、f全屏、m静音、w显示声波、q退出。 -nodisp -autoexit的组合很适合当命令行播放器用,或在脚本里做「试听」。- 服务器上没声卡也能跑
-nodisp,只解码不播声音用-nodisp -an。
07转换容器与抽取内容
只换盒子(不重编码)
ffmpeg -y -i in.mkv -c copy -movflags +faststart out.mp4
+faststart 把索引(moov)挪到文件头,浏览器才能边下边播。做网页用的 MP4 建议常加。
只要声音 / 只要画面
ffmpeg -y -i in.mp4 -vn -c:a copy out.m4a # 抽音轨,不重编码
ffmpeg -y -i in.mp4 -vn -c:a libmp3lame -q:a 2 out.mp3
ffmpeg -y -i in.mp4 -an -c:v copy out_video.mp4 # 去掉声音
ffmpeg -y -i in.mkv -c:s srt out.srt # 导出文本字幕
-vn 不要视频、-an 不要音频、-sn 不要字幕、-dn 不要数据流。
codec not currently supported in container。换成 MKV(out.mkv),或只重编码那一路不兼容的流。08转码与码率控制
体积和画质的主旋钮是 CRF(恒定质量),不是码率。CRF 越小越清晰越大。常用三档:
# ① 通用:画质优先(H.264 默认 CRF 23,18 接近视觉无损,28 明显更小)
ffmpeg -y -i in.mp4 -c:v libx264 -crf 23 -preset medium -pix_fmt yuv420p \
-c:a aac -b:a 160k -movflags +faststart out.mp4
# ② 限制峰值码率:CRF 定常态,maxrate/bufsize 按住尖峰
ffmpeg -y -i in.mp4 -c:v libx264 -preset slow -crf 22 -maxrate 4M -bufsize 8M \
-c:a aac -b:a 160k out.mp4
# ③ 必须压到固定平均码率:两遍编码(第一遍只分析)
ffmpeg -y -i in.mp4 -c:v libx264 -b:v 2M -pass 1 -an -f null /dev/null
ffmpeg -y -i in.mp4 -c:v libx264 -b:v 2M -pass 2 -c:a aac -b:a 160k out.mp4
Windows 把 /dev/null 换成 NUL。preset 只影响压缩效率(ultrafast → veryslow),不影响画质档位本身。
09剪切与合并
剪切
ffmpeg -y -ss 00:01:00 -to 00:01:30 -i in.mp4 -c copy out.mp4
ffmpeg -y -i in.mp4 -ss 00:01:00 -to 00:01:30 \
-c:v libx264 -crf 20 -c:a aac -b:a 160k out.mp4
-t 10 是「持续 10 秒」,-to 00:00:10 是「停在第 10 秒」。和 -ss 同用时 -to 是绝对时间,不是时长。
合并
# list.txt 内容(路径相对于运行命令的当前目录):
# file 'part1.mp4'
# file 'part2.mp4'
ffmpeg -y -f concat -safe 0 -i list.txt -c copy out.mp4
ffmpeg -y -i a.mp4 -i b.mp4 -filter_complex \
"[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" -c:v libx264 -crf 23 -c:a aac out.mp4
Non-monotonous DTS)。不一致就先统一转一遍,再拼。10截图、GIF、图片序列
# 第 5 秒截一张(q:v 越小越清晰,2~5 够用)
ffmpeg -y -ss 00:00:05 -i in.mp4 -frames:v 1 -q:v 2 thumb.jpg
# 每 10 秒一张
ffmpeg -y -i in.mp4 -vf fps=1/10 thumb_%03d.jpg
# 每个场景变化截一张(thumbnail 滤镜)
ffmpeg -y -i in.mp4 -vf "thumbnail=300" -frames:v 1 cover.jpg
ffmpeg -y -ss 1 -t 3 -i in.mp4 \
-vf "fps=12,scale=480:-2:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
out.gif
# 序列合成视频(文件名 frame_0001.png ...)
ffmpeg -y -framerate 30 -i frame_%04d.png -c:v libx264 -pix_fmt yuv420p -movflags +faststart out.mp4
# 视频拆成序列
ffmpeg -y -i in.mp4 -q:v 2 frame_%04d.png
# 一张图 + 一条音轨做成视频(封面音频那种)
ffmpeg -y -loop 1 -i cover.jpg -i audio.mp3 \
-c:v libx264 -tune stillimage -pix_fmt yuv420p -c:a aac -b:a 192k -shortest out.mp4
11录屏与录音
ffmpeg -f avfoundation -list_devices true -i "" # 先列出设备编号
ffmpeg -y -f avfoundation -i "1:0" \
-c:v libx264 -preset ultrafast -crf 20 -pix_fmt yuv420p -c:a aac -b:a 128k out.mp4
"1:0" 里前一个是视频设备号、后一个是音频设备号。首次使用需在「系统设置 → 隐私与安全性 → 屏幕录制」里给终端授权。
ffmpeg -y -f x11grab -video_size 1920x1080 -framerate 30 -i :0.0 \
-f pulse -i default \
-c:v libx264 -preset ultrafast -crf 20 -pix_fmt yuv420p -c:a aac out.mkv
# Wayland / PipeWire 桌面
ffmpeg -y -f pipewire -i 0 -c:v libx264 -preset ultrafast out.mkv
ffmpeg -f list_devices true -i dummy # 列出 DirectShow 设备
ffmpeg -y -f gdigrab -framerate 30 -i desktop -c:v libx264 -preset ultrafast out.mp4
ffmpeg -y -f dshow -i audio="麦克风阵列" -c:a aac voice.m4a
-preset ultrafast 或硬件编码(见第 15 节),否则来不及压缩会疯狂丢帧;录完再慢慢转一次压小。要限制时长加 -t 00:05:00。12推流、拉流与切片
ffmpeg -re -i in.mp4 \
-c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k -g 60 \
-c:a aac -b:a 128k -ar 44100 -f flv rtmp://host/live/streamkey
-re 按实时速度读取,不加会「以最快速度推完」。文件推流必须加。-g 60 是关键帧间隔,直播通常设成帧率的 2 倍。Owncast 的容器部署,以及 144p 到 4K 各一档的推流命令,见 用 Docker 部署 Owncast,并按分辨率用 FFmpeg 推流。
# 循环推一个文件(做测试流很好用)
ffmpeg -re -stream_loop -1 -i in.mp4 -c:v libx264 -preset veryfast -b:v 2500k \
-c:a aac -b:a 128k -f flv rtmp://host/live/key
# 把直播存下来
ffmpeg -y -i rtmp://host/live/key -c copy -f mp4 out.mp4
# RTSP 摄像头(tcp 更稳)
ffmpeg -y -rtsp_transport tcp -i rtsp://user:pass@192.168.1.64/stream -c copy out.mp4
# 点播切片
ffmpeg -y -i in.mp4 -c:v libx264 -crf 23 -c:a aac \
-f hls -hls_time 6 -hls_playlist_type vod -hls_segment_filename "seg_%03d.ts" out.m3u8
# 直播切片(滚动窗口)
ffmpeg -y -i rtmp://host/live/key -c:v libx264 -preset veryfast -c:a aac \
-f hls -hls_time 4 -hls_list_size 6 -hls_flags delete_segments+append_list live.m3u8
ffprobe rtmp://... 确认地址通;推流端报错优先看码率是否超平台上限、音频采样率是否 44100、关键帧间隔是否过大。协议不通(Protocol not found / tls 相关)多半是这份 ffmpeg 没编译对应协议。13滤镜速查
视频滤镜写 -vf,音频写 -af,多路输入或需要分支时用 -filter_complex。多个滤镜用逗号串起来,从左到右执行。
| 滤镜 | 作用 | 写法 |
|---|---|---|
| scale | 缩放 | scale=1280:-2(-2 自动取偶数) |
| crop | 裁剪 | crop=1280:720:0:0(宽:高:x:y) |
| pad | 加边 | pad=1920:1080:-1:-1:color=black |
| fps | 改帧率 | fps=30 |
| transpose | 旋转 90° | transpose=1(2 为逆时针) |
| hflip / vflip | 水平 / 垂直翻转 | hflip |
| yadif / bwdif | 去隔行 | yadif |
| eq | 亮度对比度饱和度 | eq=brightness=0.05:saturation=1.2 |
| unsharp | 锐化 | unsharp=5:5:1.0 |
| hqdn3d / nlmeans | 降噪(后者更慢更好) | hqdn3d |
| overlay | 叠加水印 / 画中画 | overlay=W-w-24:H-h-24 |
| drawtext | 写字(需 libfreetype) | drawtext=text='hi':fontfile=/path.ttf:x=10:y=10:fontsize=24 |
| fade | 淡入淡出 | fade=t=in:st=0:d=2 |
| setpts | 改画面时间(变速) | setpts=0.5*PTS(2 倍速) |
| volume | 音量 | volume=1.5 或 volume=-6dB |
| atempo | 音频变速(0.5–2.0) | atempo=1.5 |
| loudnorm | 响度归一 | loudnorm=I=-16:TP=-1.5:LRA=11 |
| afftdn / anlmdn | 音频降噪 | afftdn=nf=-25 |
| silencedetect | 检测静音段 | silencedetect=noise=-30dB:d=0.5 |
| amix | 混音 | amix=inputs=2:duration=first |
| aresample | 重采样 / 改采样率 | aresample=48000 |
# 缩放 + 加亮 + 去噪
ffmpeg -y -i in.mp4 -vf "scale=1280:-2,eq=brightness=0.03,hqdn3d" \
-c:v libx264 -crf 23 -c:a copy out.mp4
# 右下角水印 + 音频响度归一
ffmpeg -y -i in.mp4 -i logo.png -filter_complex "overlay=W-w-24:H-h-24" \
-af loudnorm=I=-16:TP=-1.5 -c:v libx264 -crf 23 -c:a aac -b:a 160k out.mp4
# 2 倍速(画面和声音一起改)
ffmpeg -y -i in.mp4 -filter:v "setpts=0.5*PTS" -filter:a "atempo=2.0" \
-c:v libx264 -crf 23 -c:a aac -b:a 160k out.mp4
滤镜不存在会报 No such filter,用 ffmpeg -filters | grep 名字 确认。中文字体请写 fontfile 的真实路径,不要指望 FontName 一定能命中。
14字幕与多音轨
# MKV 支持几乎所有字幕格式
ffmpeg -y -i in.mp4 -i sub.srt -c copy -c:s srt out.mkv
# MP4 里用 mov_text;ASS 特效会丢
ffmpeg -y -i in.mp4 -i sub.srt -c copy -c:s mov_text out.mp4
ffmpeg -y -i in.mp4 \
-vf "subtitles=sub.srt:force_style='FontName=PingFang SC,FontSize=22'" \
-c:v libx264 -crf 23 -c:a copy out.mp4
烧录要编译了 libass。ASS 用 -vf "ass=sub.ass"。多语言字幕:-i zh.srt -i en.srt -map 0 -map 1 -map 2 -c copy -c:s srt -metadata:s:s:0 language=chi -metadata:s:s:1 language=eng out.mkv。
15硬件加速
先跑 ffmpeg -hwaccels 看解码加速,再跑 ffmpeg -encoders | grep -E 'nvenc|videotoolbox|qsv|vaapi|amf' 看能用哪个编码器。名字不在列表里就别写。
| 平台 | 编码器 | 要点 |
|---|---|---|
| NVIDIA | h264_nvenc / hevc_nvenc | -preset p1..p7;-rc vbr -cq 23 或 -b:v 6M |
| macOS | h264_videotoolbox / hevc_videotoolbox | 用码率(-b:v 6M)而不是 CRF |
| Intel | h264_qsv / hevc_qsv | 常配合 -hwaccel qsv |
| Linux / AMD | h264_vaapi / h264_amf | VAAPI 需要设备节点,如 -vaapi_device /dev/dri/renderD128 |
# 用显卡解码,CPU 侧滤镜,再硬件编码(滤镜时必须把数据搬回内存)
ffmpeg -y -hwaccel cuda -i in.mp4 -vf "scale=1280:-2" \
-c:v h264_nvenc -preset p5 -rc vbr -cq 25 -c:a copy out.mp4
# 纯转封装式加速:只换编码,不动画面
ffmpeg -y -i in.mp4 -c:v h264_videotoolbox -b:v 6M -c:a aac -b:a 160k -movflags +faststart out.mp4
libx264 -preset slow。批量转存、录屏、实时推流用硬件;要压到很小还要保住细节,用软件编码慢慢跑。16批量与脚本
for f in *.mov; do
ffmpeg -nostdin -y -loglevel error -i "$f" \
-c:v libx264 -crf 22 -preset medium -pix_fmt yuv420p \
-c:a aac -b:a 160k -movflags +faststart \
"${f%.mov}.mp4"
done
find . -maxdepth 2 -name '*.mkv' -print0 \
| xargs -0 -n 1 -P 4 -I{} sh -c 'ffmpeg -nostdin -y -loglevel error -i "{}" -c copy "${0%.mkv}.mp4"' {}
Get-ChildItem *.mov | ForEach-Object {
ffmpeg -nostdin -y -i "$($_.Name)" -c:v libx264 -crf 22 -c:a aac -b:a 160k `
"$($_.BaseName).mp4"
}
- 循环里一定要加
-nostdin:否则 ffmpeg 会吞掉脚本的 stdin,第二个文件开始就漏处理。 -loglevel error只在出错时打印,批量跑时日志干净。- 机械硬盘上并发别超过 2~4,瓶颈会变成磁盘寻道;SSD 可以按 CPU 核数来。
- 先拿一个文件跑通,再上循环。别在原文件上覆盖输出(
out.mp4别写成同一个名字)。
17排错对照
| 报错关键词 | 常见原因 | 怎么处理 |
|---|---|---|
| Unknown encoder | 这份编译没有该编码器 | 跑 ffmpeg -encoders 换名字,或换构建 |
| No such filter | 滤镜未编译进这份 ffmpeg | ffmpeg -filters | grep 确认;缺 libass/libfreetype 时换构建 |
| Invalid data found when processing input | 文件损坏、后缀骗人、或地址不通 | 先 ffprobe;网络流先确认能访问 |
| Unable to find a suitable output format | 输出后缀没写 / 容器名拼错 | 补后缀或显式 -f mp4 |
| codec not currently supported in container | 编码和盒子不配 | 换 MKV,或只重编码那一路 |
| height not divisible by 2 | yuv420p 不接受奇数边 | scale=1280:-2 或 scale=trunc(iw/2)*2:trunc(ih/2)*2 |
| Non-monotonous DTS | 源时间戳乱(拼接、部分录像) | 加 -fflags +genpts 并重新编码,不要 copy |
| Too many packets buffered | 输出流被阻塞(多输出 / muxer 慢) | 加 -max_muxing_queue_size 1024 |
| Protocol not found / tls 相关 | 没编译 https / rtmps 等协议 | 换带 openssl 的构建,或走 http |
| moov atom not found | MP4 没下完或索引损坏 | 重新获取;完整文件用 +faststart |
| Invalid file index / Stream map matches no streams | -map 里写错输入或流编号 | 用 ffprobe 重新数一遍,下标从 0 开始 |
| Past duration too large | 源时间戳问题,多为警告 | 先跑完看结果;不对再加 -fflags +genpts |
| 输出 0 字节 / Conversion failed | 输出被占用、磁盘满、参数冲突 | 换输出名;先跑一条不带滤镜的最小命令验证 |
ffprobe 确认源能读 → ② 去掉所有滤镜只做 -c copy → ③ 加编码器 → ④ 最后加滤镜。哪一步挂了,问题就在那一步。18参数速查表
| 选项 | 含义 |
|---|---|
| -i | 指定输入文件 / 地址,可多次出现 |
| -c / -c:v / -c:a / -c:s | 编码器:全部 / 视频 / 音频 / 字幕 |
| -c copy | 流原样拷贝,不重编码 |
| -crf | 恒定质量,越小越清晰(x264 默认 23,x265 默认 28) |
| -preset | 编码速度档:ultrafast → veryslow |
| -b:v / -b:a | 视频 / 音频码率,如 4M、160k |
| -maxrate / -bufsize | 峰值码率与缓冲窗口 |
| -pix_fmt | 像素格式,网页通用 yuv420p |
| -r | 输出帧率 |
| -s | 分辨率,如 1280x720(有 -vf 时优先用 scale) |
| -vf / -af / -filter_complex | 视频滤镜 / 音频滤镜 / 复杂滤镜图 |
| -map | 选择要输出的流 |
| -ss / -t / -to | 起点 / 持续时长 / 终点 |
| -f | 强制容器或协议,如 mp4、flv、hls、null |
| -movflags +faststart | MP4 索引前置,网页边下边播 |
| -vn / -an / -sn / -dn | 丢弃视频 / 音频 / 字幕 / 数据流 |
| -shortest | 以最短的输入流为准结束 |
| -ar / -ac | 音频采样率 / 声道数 |
| -af volume= | 调节音量 |
| -metadata | 写元数据,如 -metadata title="x" |
| -stream_loop N | 输入循环 N 次,-1 为无限 |
| -re | 按实时速度读输入(推流用) |
| -hwaccel | 解码硬件加速,如 cuda、qsv、videotoolbox |
| -threads | 线程数,0 为自动 |
| -nostdin | 不读标准输入(脚本循环必加) |
| -loglevel | 日志级别:error / warning / info / debug |
| -benchmark | 结束时打印耗时 |
| -framerate | 图片序列等输入的帧率 |
| -g | 关键帧间隔(GOP),直播常用帧率 ×2 |
| -tag:v hvc1 | HEVC 在 MP4 里给苹果设备用的标签 |
| -segment_time | 分段输出时长,配合 -f segment |
| -safe 0 | concat 允许绝对路径 |
| -hls_time / -hls_list_size | HLS 切片时长 / 播放列表条目数 |
没有匹配的参数。
参数是会变的。任何一条记不准时,跑 ffmpeg -h full 或 ffmpeg -h encoder=libx264 看本机帮助——以它为准,不以记忆为准。
相关:FFmpeg 转码:从看片到出片(编码器选型、CRF 对照、硬件编码与转码报错)· 系统工具使用 · 拾光笔记首页