【FFmpeg】入门常用功能

安装

到ffmpeg.org下载full版,添加ffmpeg下的bin文件夹的文件路径到环境变量
使用

在命令行中输入:

    ffmpeg -h    

(查看帮助)

    ffmpeg -i demo.mp4

(输入视频,查看信息)

    ffmpeg -i demo.mp4 demo.mkv    

(最简单的视频格式转换)把mp4转成mkv,同时这个方法可以直接把视频转成音频

    ffmpeg -i video_with_audio.mp4 -i newAudio.wav \
    -map 0:0 \
    -map 1:0 \
    -c:v copy \
    -c:a libmp3lame -q:a 0 \
    -shortest \
    video_with_newAudio.mp4

(给视频替换音轨)(或者是给无音频的视频添加音频)
代码解释:
代码里的"\"表示换行,你可以不换,如果你想换,Windows里输入^再回车,Linux里输入\再回车。
两个-i作用是:输入视频文件和音频文件,若文件名有空格,可用单引号'将文件名括起来
-map0:0意思是:第一个0指第一个输入的文件(.mp4),第二个0是指容器(.mp4)的第一条轨道(视频)
-map1:0意思是:第二个输入的文件(.wav)的第一条轨道(音频)
-c:v copy意思是:c(codecs编解码器) v(video视频) copy(即复制原轨道)
-c:a 指定音频编码器为libmp3lame,这个是.mp4的音频轨道所用的编码器
-q:a表示质量,质量分布范围为0~6,其中0表示高质量音频,6表示低质量音频。
-shortest 指合并视频和音频的时候,合并出来的视频时间长度取其中最短的那个。
video_with_newAudio.mp4 是你想生成的最终视频的名字。


(linux用grep、windows用findstr)该命令可查看到h264的编码器(compiler)是libx264,也可以看到nvdia显卡加速的编码器是h264_nvencffmpeg -i demo.mp4 -c:v libx265 demo.mkv            
指定视频video用h265的编码器compilerffmpeg -i demo.mkv -c:v copy demo2.mp4            
指定视频流不再重解码编码,节约时间,但前提是输出的容器(mp4)要支持原容器(mkv)里的视频流的格式ffmpeg -i demo.mp4 -c:v hevc_nvenc -c:a libmp3lame -c:s srt -b_ref_mode 0 demo.mkv
指定nvdia(nv)卡加速视频编码,指定音频编码器,指定字幕格式srt,如果电脑不支持b模式可以设为0,输出为一个mkv文件ffmpeg -i demo.mp4 -c:v hevc_nvenc -c:a libmp3lame -c:s srt -b_refmode 0 ^(Windows换行继续写代码的符号,linux用\)
More?(这是windows输入^再按回车后出现的) -map 0:v:0 -map 0:a:0 -map 0:a:1 -map 0:s:0 -map 0:s:1 demo.mkv

一个.mp4,.mkv等文件是一个容器,里面会包含若干个视频、音频、字幕、数据流。

demo.mp4包含一个视频流,两个音频流,两个字幕流,该代码指定这五个流都转换到demo.mkv中,而非默认的只转换三个流(视频音频字幕)

ffmpeg -i demo.mp4 -c:a copy demo.aac (提取出音频流)

ffmpeg -i demo.mp4 demo.mp3  (提取出音频流)

ffmpeg -i demo.mp4 -s 720x480 -r 20 -b:v 1M demo.mkv  (指定分辨率,帧率fps,比特率bit/s)

ffmpeg -i demo.mp4 -ss 00:00:03 -t 00:00:02 demo.mkv (从-ss开始,截取时间长度-t(也可以直接写5,代表5秒)

ffmpeg -i demo.mp4 -ss 00:00:03 -to 00:00:05 demo.mkv  (和上面一样的功能,-to是终止时刻)

ffmpeg -i demo_cn.mp4 -i demo_en.mp4 -i demo_srt_cn.srt -i demo_srt_en.srt
-map 0:v -map 0:a -map 1:a -map 2:s -map 3:s -c:s mov_text demox.mp4

四个-i输入,-map匹配:把第一个输入的视频流,第一个输入的音频流,第二个输入的音频流,第三个输入的字幕流,第四个输入的字幕流,合在一个mp4容器中输出,因为srt格式字幕不能直接嵌入mp4,所以用了mov_text这个字幕编码器

在(最简单的视频格式转换)的基础上控制画质:

ffmpeg -i test.avi -c:v libx264 -preset XXX output.mp4

(XXX可以是ultrafast superfast veryfast faster fast medium(默认) slow slower veryslow)

越慢,越大,越无损。砂糖一般用slower

ffmpeg -i test.avi -c:v libx264 -crf 22 output.mp4

(-crf用于视频压制(让视频体积变小),数值0(无损)~51(最差质量),常用范围是19~28) 肉眼无法看出画质降低的数值是18,砂糖一般用18

Video Filter:

ffmpeg -i test.avi -c:v libx264 -vf "scale=1920:-1,transpose=2" output.mp4

缩放视频分辨率到1K,-1是自适应高度,transpose=2是逆时针转90度

ffmpeg -i test.avi -c:v libx264 -vf "crop=400:400:100:100" output.mp4用于视频裁剪,crop=w:h:x:y   代表宽高和位置(左上角为原点,→x,↓y)
crop=iw/3:ih/3         代表input width除以3,也就是缩小3倍

合并视频

mylist.txt:

file 'clip1.mp4'
file 'clip2.mp4'
file 'clip3.mp4'

ffmpeg -f concat -i mylist.txt -c copy output.mp4

-f 指定接下来要输入的文件是一个视频列表,concat合并,-i输入,-c copy表示不用重编码视频,因为都是一样的编码,最后输出合并的视频。

Audio Filter:

ffmpeg -i test.mp4 -af "volume=1.5" output.mp4   (音量增大)

"loudnorm=I=-5:LRA=1"    (统一视频音量)

"equalizer=f=1000:width_type=h:width=200:g=-10"   (高通低通滤波器均衡器)

ffmpeg -i test.mp4 -an output.mp4 (删除音频流)

-vn 删除视频流- sn 删除字幕流 -dn 删除数据流

创建视频缩略图

ffmpeg -i test.mp4 -vf "fps=1/10,scale=-2:720" thumbnail-%03d.jpg

(-2强制自适应大小为偶数,因为分辨率必须为偶数;fps=1/10即是每十秒输出一张图;输出图片thumbnail加编号)

(C语言中,% 是格式符的开始。d 表示有符号整数。3 表示最小输出3位数字。0 表示如果数字不足3位,在左边用0补成3位。)

添加水印

ffmpeg -i test.mp4 -i cat.jpg -filter_complex "overlay=100:100" output.mp4

把猫图水印添加到视频x:y位置,原点左上角

gif制作

gif本身限制,不适合较长视频,因此需要先剪切出一个片段

ffmpet -i test.avi -ss 0 -t 3 -filter_complex [0:v]fps=15,scale=-1:256,split[a][b];[a]palettegen[p];[b][p]paletteuse output.gif

然后用过滤器缩放视频并且降低视频的帧率,

最后spilt...这部分纯粹是因为gif自身256色的限制,需要单独创建一个调色板。
屏幕录像

注:别用ffmpeg玩屏幕录像了,被OBS吊起来打(指用法方便性上)

ffmpeg -hide_banner -loglevel error -stats -f gdigrab -framerate 60 -offset_x 0 -offset_y 0 -video_size 2560x1440 -draw_mouse 1 -i desktop -c:v libx264 -r 60 -preset ultrafast -pix_fmt yuv420p -y screen_record2.mp4

输入q结束录制。ctrl+c中断也行。

占用大小,2K分辨率,一小时不到1G(个人估算)

但gdigrab在windows上无法录制音频,还需要安装两个dll:

audio_sniffer.dll和audio_sniffer-x64.dll

可以安装Screen Capturer Recorder后从软件目录拷贝出来(在vendor/virtual-audio文件夹下)

这个软件其实就是个内置ffmpeg的录屏软件。安装后可以直接打开使用(但如果电脑没装java,需要去安装个java才能运行本软件)。但这个软件虽然用ruby写的但我没搞懂怎么用,还是删了。

找到两个dll后,拷贝出来随便存到一个地方,比如C:\ffmpeg-6.0-full_build\virtual-audio\(我自己建的文件夹),用管理员模式打开CMD窗口(右键点击win图标),执行以下命令(cmd里按右键粘贴):

regsvr32 "C:\ffmpeg-6.0-full_build\virtual-audio\audio_sniffer.dll" regsvr32 "C:\ffmpeg-6.0-full_build\virtual-audio\audio_sniffer-x64.dll"

现在可以录制声音了。(我忘了到底可不可以了,反正我放弃用ffmpeg录像,没必要)

录制屏幕+麦克风+文字水印

查看设备名称:

打开CMD窗口,进入ffmpeg.exe所在目录(如果添加过环境变量就不用),执行以下命令:

ffmpeg -list_devices true -f dshow -i dummy

如果出现中文乱码,则首先执行一下这个命令:chcp 65001,然后再查看可用设备。

拷贝水印字体文件:

打开C:\Windows\Fonts\目录,找到微软雅黑(msyh.ttf),或者自己下载一个字体

将字体拷贝到ffmpeg所在目录,例如C:\ffmpeg-6.0-full_build\Yumeko_ziti\msyh.ttf

ffmpeg -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -rtbufsize 1000M -thread_queue_size 1024 -f gdigrab -i desktop -pix_fmt yuv420p -vf drawtext="fontcolor=red:fontsize=50:fontfile='msyh.ttf':text='冰蓝砂糖':x=50:y=50" -y C:\Users\Yumeko\Videos\luping.mp4

六、录制屏幕+声卡+麦克风+文字水印 打开CMD窗口,执行以下命令:

ffmpeg -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -rtbufsize 1000M -thread_queue_size 1024 -f gdigrab -i desktop -pix_fmt yuv420p -vf drawtext="fontcolor=red:fontsize=50:fontfile='msyh.ttf':text='鱼知凡工具箱':x=50:y=50" -y D:\tools\luping.mp4

结束录制:

在CMD窗口中输入q

七、录制摄像头+麦克风+文字水印 打开CMD窗口,执行以下命令:

D:\tools\ffmpeg.exe -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i video="USB2.0 Camera" -pix_fmt yuv420p -vf drawtext="fontcolor=red:fontsize=50:fontfile='msyh.ttf':text='鱼知凡工具箱':x=50:y=50" -y D:\tools\luping.mp4

结束录制:

在CMD窗口中输入q

八、录制摄像头+声卡+麦克风+文字水印 打开CMD窗口,执行以下命令:

D:\tools\ffmpeg.exe -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i audio="麦克风 (Realtek High Definition Audio)" -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -rtbufsize 1000M -thread_queue_size 1024 -f dshow -i video="USB2.0 Camera" -pix_fmt yuv420p -vf drawtext="fontcolor=red:fontsize=50:fontfile='msyh.ttf':text='鱼知凡工具箱':x=50:y=50" -y D:\tools\luping.mp4

结束录制:

在CMD窗口中输入q

屏幕录制

先查看设备

ffmpeg -list_devices true -f dshow -i dummy

会出现一堆设备,它们分别是(以我的为例):

HD Webcam(笔记本摄像头)

screen-capture-recorder(显示屏录像)

麦克风(CM383-80864)(USB耳机) /   麦克风(Realtek(R) Audio) (3.5mm耳机)

virtual-audio-capturer (系统声音)

...

录制视频(默认参数)

桌面:ffmpeg -f dshow -i video="screen-capture-recorder" v-out.mp4

摄像头:ffmpeg -f dshow -i video="HD Webcam" v-out2.flv (要根据自己摄像头名称)

录制声音(默认参数)

系统声音:ffmpeg -f dshow -i audio="virtual-audio-capturer" a-out.aac

系统+麦克风声音:ffmpeg -f dshow -i audio="麦克风 (Realtek(R) Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 a-out2.aac

同时录制声音和视频(默认参数)

ffmpeg -f dshow -i audio="麦克风 (Realtek(R) Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -i video="screen-capture-recorder" av-out.flv

确认覆盖

-y

查看视频录制的可选参数

ffmpeg -f dshow -list_options true -i video="screen-capture-recorder"

播放视频

ffplay


/**

    ffmpeg将视频分割

    ffmpeg命令eg:


        ffmpeg -ss 00:00:00 -i test.mp4 -c copy -t  600  output.mp4

    此处是将视频test.mp4从00:00:00处分割600s,分割出的视频名字是output.mp4


        ffmpeg -ss 00:00:00 -t 00:01:30 -i test.mp4 -vcodec copy -acodec copy output.mp4

    此处是将视频test.mp4从00:00:00处分割到01:30处,分割出的视频名字是output.mp4 *

    备注:

    有些视频裁剪后你会发现可能开始和结束都不是很准确,有可能是从00秒开始,33秒结束。

    因为这些视频里30秒处地方刚好不是关键帧,而ffmpeg会在你输入的时间点附近圆整到最接近的关键帧处,然后做接下来的事情。 *


    注释:

    -ss  指定从什么时间开始分割

    -i   要分割的视频文件

    -t   指定需要截取多长时间:

    格式如下


        -t  xx        // 单位 秒,指截取30s


        -t  00:01:30  // 时:分:秒,指截取到播放时间为01:30处

    注意 :-ss 要放在 -i 之前


 

我们可以使用以下的命令格式来输出一个视觉无损的视频:

ffmpeg -i 输入文件名 -c:v libx265 -x265-params crf=18 output/输出文件名.mp4

给视频替换(添加)音轨使用FFmpeg添加、删除、替换和提取视频中的音频 - 知乎 (zhihu.com)

ffmpeg -i video_with_audio.mp4 -i newAudio.wav \

-map 0:0 \

-map 1:0 \

-c:v copy \

-c:a libmp3lame -q:a 1 \

-shortest \
video_with_newAudio.mp4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值