10

我在命令行下剪辑视频

 3 years ago
source link: https://zhuanlan.zhihu.com/p/349752230
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

是的,你不需要格式工厂,你也不需要会声会影,更不需要爱剪辑这些莫名其妙的流氓软件,命令行下视频处理,包括剪辑,转码,提取,合成,缩放,字幕,特效等等,全部命令行搞定,这不是疯狂,而是效率:

MP4 转换 GIF

知乎可以发 MP4,但对桌面录屏这种十多二十秒的小短片远远没有 GIF 来的便捷,GIF 在很多软件里支持的也比 MP4 要广泛,转换命令为:

ffmpeg -i in.mp4 -an -c:v gif out.gif

参数 -i 的指明输入文件 "in.mp4" , -an 代表禁用音频, -c:v 的意思是指定视频编码为 gif,最后是输出文件名。

那么效率在哪里呢? 别急,我们写完善点,做个脚本:video_convert_to_gif.cmd

@echo off
if "%1" == "" goto HELP

set "IN=%1"
set "OUT=%~dpn1.gif"

if "%2" == "" goto NEXT
set "OUT=%2"
:NEXT

call ffmpeg -i "%IN%" -an -c:v gif "%OUT%"
pause
goto END

:HELP
echo usage: video_convert_to_gif ^<input^> [^<output^>]
:END
echo.

将上面的脚本完善一下,保存成名为 video_convert_to_gif.cmd 的脚本:

ErY32e7.png!mobile

每次要使用的时候,直接把任何格式的视频文件拖到这个脚本上面去,同级目录下就有了一个 gif 文件了,比你格式工厂修改一半天点点点来的高效多了。

转换为 MP4

最简单写法:

ffmpeg -i in.wmv -c:v libx264 -c:a aac out.mp4

前面输入可以是任意格式的视频文件,用 -c:v 指定视频编码器是 libx264,用 c:a 指定音频编码器是 aac,然后输出 mp4,考虑到某些安卓机可能无法正确播放,完善下:

ffmpeg -i in.wmv -c:v libx264 -c:a aac -pix_fmt yuv420p -vf ^
          "scale=trunc(iw/2)*2:trunc(ih/2)*2" out.mp4

针对部分安卓机只能播放 yuv420 的像素格式的问题,做了一些处理,并且把长宽设置为偶数,否则无法使用 yuv420 格式,完善一下,写成脚本:

@echo off
if "%1" == "" goto HELP

set "IN=%1"
set "OUT=%~dpn1.mp4"

if "%2" == "" goto NEXT
set "OUT=%2"
:NEXT

call ffmpeg -i "%IN%" -c:v libx264 -c:a aac ^
	-pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" ^
   	"%OUT%"
pause
goto END

:HELP
echo usage: video_convert_to_mp4 ^<input^> [^<output^>]
:END
echo.

保存成 video_convert_to_mp4.cmd 用法和上面相同,也是鼠标拖上去就行了。

转换 H.265

和转换 264 类似:

ffmpeg -i in.mp4 -c:v libx265 -c:a aac ^
	-pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" ^
	out.x265.mp4

脚本文件可以照葫芦画瓢,头两行最后用了 ^ 符号,代表命令在下一行继续。

GIF 转换 MP4

上面有了 MP4 到 GIF,反过来的话,需要做一些处理,添加一段空白音频,不然有些软件或者网站可能出问题:

ffmpeg -f lavfi -i anullsrc -i in.gif -c:v libx264 -c:a aac -shortest ^
       -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" out.mp4

这里用了 anullsrc 代表空的音频输入,同时加了一个 -shortest 代表多个输入取时间最短的那个,一样照葫芦画瓢做一个脚本文件封装一下即可。

MP4 分离音频

将 MP4 的音频分离出来,保存成 mp3 也是比较常见的用法:

@echo off
if "%1" == "" goto HELP

set "IN=%1"
set "OUT=%~dpn1.mp3"

if "%2" == "" goto NEXT
set "OUT=%2"
:NEXT

call ffmpeg -i "%IN%" -vn -c:a mp3 -ar 48000 -ac 2 "%OUT%"

pause

goto END
:HELP
echo usage: video_extract_audio ^<input^> [^<output^>]
:END
echo.

保存成 video_extract_audio.cmd 把文件拖上去即可转换。

这里 -vn 的意思是禁用视频, -c:a 指定编码为 mp3, -ar 的意思是指定音频采样率为 48000,同时 -ac 的意思是声道数量。

视频裁剪

直接上脚本:

@echo off
if "%3" == "" goto HELP
set "IN=%1"
set "OUT=%~dpn1_clip%~x1"

if "%4" == "" goto NEXT
set "OUT=%4"
:NEXT

call ffmpeg -i "%IN%" -ss "%2" -to "%3" -c:a copy -c:v copy "%OUT%"
pause
goto END

:HELP
echo usage: video_clip ^<input^> ^<from ^(00:00:00.000^)^> ^<to ^(00:10:00.000^)^> [^<output^>]
:END
echo.

指定输入文件,然后从几分几秒到积分几秒即可:

video_clip in.mp4  00:00:00  00:00:10 out.mp4

即可剪辑头 10 秒钟的视频保存成 out.mp4

视频合并

将两段视频合并成一段:

@echo off
if "%2" == "" goto HELP

set "IN1=%1"
set "IN2=%2"
set "OUT=%~dpn1_%~dpn2_merged.%~x1"

if "%3" == "" goto NEXT
set "OUT=%3"
:NEXT

call ffmpeg -i "%IN1%" -i "%IN2%" ^
	-filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]" ^
   	-map "[outv]" -map "[outa]" "%OUT%"
pause

goto END
:HELP
echo usage: video_concat ^<input1^> ^<input2^> [^<output^>]
:END
echo.

区域裁剪

将视频里的一个矩形截取出来,保存成一个新的视频:

@echo off
if "%5" == "" goto HELP

set "IN=%1"
set "OUT=%~dpn1_crop%~x1"

if "%6" == "" goto NEXT
set "OUT=%6"
:NEXT

call ffmpeg -i "%IN%" -filter:v "crop=%4:%5:%2:%3" "%OUT%"
pause

goto END
:HELP
echo usage: video_crop ^<input^> ^<x^> ^<y^> ^<w^> ^<h^> [^<output^>]
:END
echo.

这样输入源视频和矩形区域坐标和长宽即可裁剪。

更多用法

欢迎使用 ffmpeg 命令速查表:

https://github.com/skywind3000/awesome-cheatsheets/blob/master/tools/ffmpeg.sh github.com

--

附赠:我自己写好的一堆脚本

32meqij.jpg!mobile

需要的自取:

--


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK