官网:https://ffmpeg.org
FFmpeg 是领先的多媒体框架,能够解码、编码、 转码、复用、解复用、流、过滤和播放 几乎所有人类和机器创建的东西
常用参数
-i 设定输入流
-f 设定输出格式
-y 覆盖输出文件
-ss 开始时间
-b 设定视频流量(码率),默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-pix_fmt 设置色彩空间
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
-ar 设定音频采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
用法
视频转换格式
ffmpeg -i input.avi output.mp4
ffmpeg -i input.webm -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4
这里 vf 参数的意义是,将视频的长宽强制转换为偶数,否则可能遇到“width not divisible by 2”的问题。
ffmpeg -y -i 2.flv -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.mp4
-y覆盖输出文件 -vcodec copy使用与输入流相同的视频编解码器 -vbsf指定要应用的比特流滤镜
视频编码格式转换
ffmpeg -i input.mp4 -vcodec h264 output.mp4
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4
视频提取
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
视频剪切
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
-ss表示开始切割的时间
-t表示要切多少。上面就是从开始,切5秒钟出来。
为视频添加logo
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
-filter_complex overlay 是用于视频处理的 FFmpeg 命令中的一部分,它用于将一个视频流叠加(覆盖)在另一个视频流之上。这是一个常见的视频编辑和处理操作,通常用于创建叠加文字、图像、水印或其他视频元素的效果
视频叠加
ffmpeg -i input_video.mp4 -i overlay_video.mp4 -filter_complex "[0:v][1:v]overlay=100:200" output_video.mp4
[0:v] 表示主视频的视频流,[1:v] 表示叠加视频的视频流。
overlay=x:y 表示将叠加视频叠加在主视频上,其中 x 和 y 是坐标值,用于指定叠加视频的位置。
绿屏抠像
ffmpeg -i beijin.mp4 -i green_removed.mp4 -filter_complex "[1:v]chromakey=0x00FF00:0.1:0.2[v1];[0:v][v1]overlay=10:10" -c:a copy output.mp4
0x00FF00:这是绿屏的颜色。在这个例子中,它表示绿色,使用十六进制表示法。你可以根据你的绿屏颜色来替换这个值。
0.1:这是色度阈值。它定义了颜色抠像的精确度。值越小,抠像越精确,但可能会产生锯齿状的边缘。通常,你可以尝试不同的值以找到最佳的效果。
0.2:这是亮度阈值。它定义了颜色的亮度范围,用于抠像。与色度阈值一样,你可以根据需要调整它。
这些参数一起帮助chromakey滤镜从视频中去除绿屏(或其他特定颜色的背景),以便进一步处理。你可以根据实际情况调整这些参数,以获得最佳的抠像效果。
修改分辨率
#将输入的1920x1080缩小到960x540输出:
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
//ps: 也可写成 scale=960:-1, ffmpeg会通知缩放滤镜在输出时保持原始的宽高比
提取音频
ffmpeg -i 222.mp4 -acodec aac -vn output.aac
音频转换格式
ffmpeg -i input_audio.mp3 output_audio.wav
抓取视频的一些帧,存为jpeg图片
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-r 表示每一秒几帧
-q:v表示存储jpeg的图像质量,一般2是高质量。
-ss表示开始时间
-t表示共要多少时间。
统一视频格式和编码等信息
ffmpeg -i input.mp4 -s 1080x1920 -r 30 -b:v 2000k -b:a 192k -c:v libx264 -c:a aac -pix_fmt yuv420p -y output.mp4
-pix_fmt 设置色彩空间
直播
#直播推流
ffmpeg -re -i 2.mp4 -c:v copy -c:a aac -b:a 192k -strict -2 -f flv '推流地址'
-re 以原始帧速率读取输入
-b:a 设置音频输出码率
-strict 参数用于指定音频编码器和视频编码器的严格性级别。-2 表示一个特定的级别,通常用于告诉 FFmpeg 使用较宽松的设置,以便兼容一些较旧的编解码器。
#直播推流加背景音乐(混声)
ffmpeg -re -i 2.mp4 -stream_loop -1 -i Track03.mp3 -filter_complex [0:a][1:a]amix -c:v copy -c:a aac -b:a 192k -strict -2 -f flv '推流地址'
-stream_loop -1 设置循环播放输入流的次数,-1表示无限循环
-filter_complex滤镜
[0:a] 和 [1:a] 是音频输入流的标签,它们分别代表输入文件的第一个和第二个音频流。然后,amix 是混音滤镜,用于混合这两个音频流。混音操作会将这两个音频流合并为一个,通常是通过叠加它们或者按照一定的音量比例混合。
ffmpeg -re -i 2.mp4 -stream_loop -1 -i Track03.mp3 -filter_complex "[0:a]volume=0.5[a0];[1:a]volume=0.8[a1];[a0][a1]amix" -ac 2 -c:v copy -c:a aac -b:a 192k -strict -2 -f flv '推流地址'
[0:a]volume=0.5[a0] 表示将第一个输入文件的音频流的音量设置为原来的一半,并将其输出为 [a0]。
[1:a]volume=0.8[a1] 表示将第二个输入文件的音频流的音量设置为原来的 80%,并将其输出为 [a1]。
[a0][a1]amix 表示将经过音量调整的两个音频流混合成一个。
-ac 2 参数用于指定输出文件的音频通道数,这里设置为 2 表示输出文件为双声道音频
#背景音乐列表循环播放
ffmpeg -re -i 2.mp4 -stream_loop -1 -f concat -safe 0 -i music_list.txt -filter_complex "[0:a]volume=0.5[a0];[1:a]volume=0.8[a1];[a0][a1]amix" -shortest -ac 2 -c:v copy -c:a aac -b:a 192k -strict -2 -f flv "推流地址"
-f concat 表示使用文件连接协议。
-safe 0 允许使用绝对文件路径。
-shortest 会在最短输入流结束后停止输出,从而确保输出流的持续时间与最短输入流相匹配。
-i music_list.txt 指定输入文件,即包含文件列表的文本文件。
文件列表格式:
cat music_list.txt
file '/root/music/track5.mp3'
file '/root/music/track07.mp3'
file '/root/music/track06.mp3'
#视频素材和音乐素材循环播放
ffmpeg -re -stream_loop -1 -f concat -safe 0 -i video_list.txt -stream_loop -1 -f concat -safe 0 -i music_list.txt -filter_complex "[0:a]volume=0.5[a0];[1:a]volume=0.8[a1];[a0][a1]amix" -ac 2 -c:v copy -c:a aac -b:a 192k -strict -2 -f flv "推流地址"
[0:a]volume=0.5[a0];[1:a]volume=0.8[a1]混音时调整声音大小比例
#视频素材和音乐素材循环播放消除原视频声音
ffmpeg -re -stream_loop -1 -an -f concat -safe 0 -i video_list.txt -stream_loop -1 -f concat -safe 0 -i music_list.txt -ac 2 -c:v copy -c:a aac -b:a 192k -strict -2 -f flv "推流地址"
#给视频添加时间
ffmpeg -re -stream_loop -1 -i /root/video/2.mp4 -vf "drawtext=text='%{localtime\:%H}\:%{localtime\:%M}\:%{localtime\:%S}':x=100:y=500:fontsize=30:fontcolor=white" -ac 2 -c:v libx264 -c:a aac -b:a 192k -strict -2 -f flv "推流地址"
-vf 参数用于指定视频滤镜(Video Filter)。视频滤镜是一种用于对视频进行各种图像处理操作的工具,例如旋转、裁剪、调整亮度、对比度、添加水印、文本叠加等。 -vf 参数后跟着一个包含一个或多个视频滤镜的字符串,这些滤镜将按照给定的顺序应用于输入视频流。
drawtext:添加文本水印。
#视频素材和音乐素材循环播放并且加时间水印
ffmpeg -re -stream_loop -1 -f concat -safe 0 -i video_list.txt -stream_loop -1 -f concat -safe 0 -i music_list.txt -filter_complex "[0:v]drawtext=text='%{localtime\:%H}\:%{localtime\:%M}\:%{localtime\:%S}':x=100:y=500:fontsize=30:fontcolor=white;[0:a][1:a]amix=inputs=2" -ac 2 -c:v libx264 -c:a aac -b:a 192k -strict -2 -f flv "推流地址"
=inputs=2 是告诉 amix 滤镜混合前两个输入流,不加默认混合所有输入流。
#视频素材和音乐素材循环播放并且加时间水印修改字体
ffmpeg -re -stream_loop -1 -f concat -safe 0 -i video_list.txt -stream_loop -1 -f concat -safe 0 -i music_list.txt -filter_complex "[0:v]drawtext=text='%{localtime\:%H}\:%{localtime\:%M}\:%{localtime\:%S}':x=100:y=500:fontsize=30:fontfile=/root/DS-DIGIT-4.ttf:fontcolor=white;[0:a][1:a]amix=inputs=2" -ac 2 -c:v libx264 -c:a aac -b:a 192k -strict -2 -f flv "推流地址"