ffmpeg
合并视频和音频
shell
ffmpeg -i video.mp4 -i audio.mp4 -vcodec copy -acodec copy output.mp4视频拼接
shell
# 优先使用
ffmpeg -f concat -i filelist.txt -c copy output.mkv
ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
# 拼接不同编码的视频
ffmpeg -i input1.mp4 -i input2.webm -i input3.mov \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mkvfilelist.txt
plain
file 'input1.mkv'
file 'input2.mkv'
file 'input3.mkv'自动生成输入文件
可以使用 bash for 循环或使用printf. 以下任一项都会生成一个包含工作目录中每个 *.wav 的列表文件:
shell
# with a bash for loop
for f in *.wav; do echo "file '$f'" >> mylist.txt; done
# or with printf
printf "file '%s'\n" *.wav > mylist.txt在 Windows 命令行上:
shell
(for %i in (*.wav) do @echo file '%i') > mylist.txt或者对于 Windows Powershell:
shell
foreach ($i in Get-ChildItem .\*.wav) {echo "file '$i'" >> mylist.txt}或者对于 Windows bat 文件:
shell
(for %%i in (*.wav) do @echo file '%%i') > mylist.txt如果您的 shell 支持进程替换(如 Bash 和 Zsh),您可以避免显式创建列表文件并在一行中完成整个操作。这对于 concat 协议是不可能的(见下文)。确保在此处生成绝对路径,因为 ffmpeg 将解析相对于您的 shell 可能在诸如“/proc/self/fd/”之类的目录中创建的列表文件的路径。
shell
ffmpeg -f concat -safe 0 -i <(for f in ./*.wav; do echo "file '$PWD/$f'"; done) -c copy output.wav
ffmpeg -f concat -safe 0 -i <(printf "file '$PWD/%s'\n" ./*.wav) -c copy output.wav
ffmpeg -f concat -safe 0 -i <(find . -name '*.wav' -printf "file '$PWD/%p'\n") -c copy output.wav您还可以循环播放视频。此示例将循环input.mkv10 次:
shell
for i in {1..10}; do printf "file '%s'\n" input.mkv >> mylist.txt; done
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mkv转码为h.265,并启用gpu加速
shell
ffmpeg.exe -n -i video.mp4 -vcodec hevc_nvenc output.mp4
# 多音轨视频转换
ffmpeg -i video.mp4 -map 0:v -map 0:a -vcodec hevc_nvenc output.mp4
# 压缩
ffmpeg.exe -n -i video.mp4 -vcodec hevc_nvenc -preset veryslow -crf 21 output.mp4
# 脚本
foreach ($i in Get-ChildItem .\*.mp4) {$name = $i.BaseName + '.mp4'; ffmpeg.exe -n -i $i -vcodec hevc_nvenc "./h265/$name"}内嵌字幕
shell
# mp4与ass
ffmpeg.exe -n -i video.mp4 -vcodec hevc_nvenc -vf subtitles=sub.ass output.mp4
# mkv内置字幕
ffmpeg.exe -n -i video.mkv -vcodec hevc_nvenc -vf subtitles=video.mkv output.mp4
# 字幕路径需要转义
ffmpeg.exe -n -i video.mkv -vcodec hevc_nvenc -filter_complex "subtitles='[X] File - 1 [Y].mkv'" output.mp4bat脚本
shell
@echo off
for %%i in (*.mkv) do (
@REM echo %%~ni.mp4
# %%~ni 文件名去除扩展名
ffmpeg.exe -n -i "%%i" -vf "subtitles='%%i'" -vcodec hevc_nvenc ".\h265\%%~ni.mp4"
)
pause判断视频编码脚本
powershell
$infoJson = ffprobe.exe -print_format json -show_format -show_streams -select_streams v $args[0] | Out-String
$info = ConvertFrom-Json $infoJson
$codec = $info.streams | ForEach-Object { $_.codec_name }
Write-Output $codec视频剪辑
powershell
ffmpeg -ss 08:23 -to 18:27 -i .\input.mp4 -c:v copy out.mp4视频强制缩放
powershell
# 430x960 宽x高
ffmpeg -i .\input.mp4 -vf scale=540:960,setsar=sar=1/1,setdar=dar=9/16 -c:v hevc_nvenc out.mp4