FFmpeg是一个开源软件,用于处理音频和视频流,全球许许多多为人熟知的视频网站都用它,因为它支持几乎所有的音视频DIY处理功能,这篇教程就带你了解FFmpeg是如何使用的。
首先下载它,并设置为系统的环境变量: https://ffmpeg.org/download.html
一个基础的命令结构像这样:
ffmpeg [全局选项] -i 输入 [输入选项] 输出 [输出选项]Windows的话是ffmpeg.exe
下面是一份完整的命令列表,附带中文翻译
# =========================
# ffmpeg 全局参数
# =========================
-h # 显示帮助
-help # 显示完整帮助
-version # 显示版本信息
-loglevel level # 日志级别(quiet/error/warning/info/verbose/debug)
-y # 自动覆盖输出文件
-n # 文件存在则不覆盖
-stats # 显示编码进度
-hide_banner # 隐藏编译信息
# =========================
# 输入相关
# =========================
-i input.mp4 # 指定输入文件
-ss 00:01:00 # 从指定时间开始
-t 10 # 持续时间
-to 00:02:00 # 到指定时间结束
-re # 按原速读取(推流用)
-stream_loop -1 # 循环输入
-itsoffset 1.5 # 输入流时间偏移(秒)
# =========================
# 视频编码
# =========================
-c:v libx264 # H.264 CPU 编码
-c:v libx265 # H.265 CPU 编码
-c:v h264_nvenc # NVIDIA H.264 编码
-c:v hevc_nvenc # NVIDIA H.265 编码
-c:v av1_nvenc # NVIDIA AV1 编码
-c:v copy # 视频直拷贝
-profile:v high # 视频 profile
-preset slow # 编码预设
-level 4.2 # 编码级别
# =========================
# 码率 / 质量
# =========================
-b:v 1M # 平均码率
-maxrate 1M # 最大码率
-bufsize 2M # 缓冲区
-crf 23 # 恒定质量(越小越清晰)
-qp 20 # 固定量化参数
-rc vbr # 码率控制模式(cbr/vbr/cq)
# =========================
# 帧率 / GOP
# =========================
-r 30 # 帧率
-g 300 # 关键帧间隔
-keyint_min 300 # 最小关键帧
-scenecut 0 # 禁用场景切换关键帧
# =========================
# 分辨率 / 画面
# =========================
-s 1920x1080 # 分辨率
-aspect 16:9 # 宽高比
-pix_fmt yuv420p # 像素格式
-vf scale=1280:720 # 缩放
-vf crop=1280:720:0:0 # 裁剪
-vf transpose=1 # 旋转
-vf fps=30 # 修改帧率
# =========================
# 音频
# =========================
-c:a aac # AAC 音频
-c:a mp3 # MP3 音频
-c:a opus # Opus 音频
-c:a copy # 音频直拷贝
-b:a 128k # 音频码率
-ar 48000 # 采样率
-ac 2 # 声道数
-af volume=1.5 # 调整音量
-af atempo=1.25 # 音频加速
# =========================
# 字幕
# =========================
-c:s mov_text # MP4 字幕
-vf subtitles=sub.srt # 烧录字幕
-map 0:s:0 # 选择字幕流
-disposition:s:0 default # 默认字幕
# =========================
# 流映射
# =========================
-map 0 # 映射所有流
-map 0:v:0 # 选择视频流
-map 0:a:0 # 选择音频流
-map -0:a # 排除音频
# =========================
# 封装格式
# =========================
-f mp4 # MP4 封装
-f matroska # MKV
-f flv # FLV / RTMP
-f mpegts # TS
-f hls # HLS
# =========================
# HLS 专用
# =========================
-hls_time 10 # 分片时长
-hls_list_size 0 # m3u8 不限制长度
-hls_segment_filename seg_%03d.ts # 分片命名
-hls_flags independent_segments # 独立分片
-start_number 0 # 起始序号
# =========================
# 硬件加速
# =========================
-hwaccel cuda # CUDA 解码
-hwaccel_output_format cuda # GPU 输出
-init_hw_device cuda # 初始化 CUDA
-filter_hw_device cuda # GPU 滤镜
# =========================
# 推流
# =========================
-f flv rtmp://url # RTMP 推流
-f mpegts srt://url # SRT 推流
# =========================
# 调试
# =========================
-report # 生成日志
-benchmark # 性能统计
-threads 8 # 线程数FFmpeg能做的事情真的非常非常多,如果懒得自己动手或者难理解,难找到自己的需求没有关系,下面我准备了一些场景和适合的ffmpeg代码供你参考,输入文件为m.mp4 视频清晰度为1080P
场景1,设备是AMD显卡,想在比较少的损失画质,保持码率的前提下处理视频流,视频被处理成m3u8格式(HLS):
ffmpeg -i m.mp4 -vf "scale=1920:1080,format=nv12" -c:v h264_amf -profile:v main -preset balanced -start_number 0 -hls_time 10 -hls_list_size 0 -hls_segment_filename "m%d.ts" -c:a copy m.m3u8场景2,设备是英伟达显卡,想在比较少损失画质,保持码率的情况下处理视频流,视频也被处理成m3u8:
ffmpeg -hwaccel cuda -i m.mp4 -c:v h264_nvenc -profile:v main -preset p4 -s 1920x1080 -start_number 0 -hls_time 10 -hls_list_size 0 -hls_segment_filename "m%d.ts" -c:a copy m.m3u8场景3,英伟达显卡,想尽可能压低码率省流量,做视频站,将视频码率压在1Mbps(动态码率800k),清晰度不变,处理成m3u8:
ffmpeg -hwaccel cuda -i m.mp4 -c:v h264_nvenc -preset p4 -profile:v high -rc vbr -b:v 800k -maxrate 1M -bufsize 2M -r 30 -g 300 -keyint_min 300 -forced-idr 1 -no-scenecut 1 -s 1920x1080 -c:a aac -b:a 128k -f hls -hls_time 10 -hls_list_size 0 -start_number 0 -hls_segment_filename "m_%03d.ts" m.m3u8场景4,只有CPU,视频站压码率到1Mbps,处理成mp4:
ffmpeg -i m.mp4 -c:v libx264 -preset medium -profile:v high -level 4.2 -b:v 1M -maxrate 1M -bufsize 2M -pix_fmt yuv420p -movflags +faststart -c:a aac -b:a 128k out.mp4各种不同的场景适合不同的处理方式,在处理器性能不佳的情况下使用显卡处理视频流可以获得数倍的速度提升,视频处理质量越高处理时间就会越长,建议取中间值,不会损失什么画质且节省计算资源。
上图为mp4视频处理成m3u8格式后,节省了部分站点流量,在用户没有播放的内容只预先播放前面的一小节
音频也可以靠FFmpeg直接压码率的方法节省流量和空间占用,但不要压太狠了(视频也一样),对于站长也是有苦难言,毕竟流量要钱只能往死里压缩视频qwq
评论 (0)