ffmpeg 无损合并分段视频方法,附powershell脚本
以前就知道ffmpeg有这样的功能,但是一直没用过。因为通常你用的分段下载下载软件会替你完成这一过程。
最近有一个需求是录制b站的直播视频,但是因为网络波动的原因,用的录制直播流的软件录制的视频断了好几次。因此需要把分段的视频合并起来
注意想要无损合并的话,必须是同种协议的文件。不然必须进行重编码。
注意想要无损合并的话,必须是同种协议的文件。不然必须进行重编码。
有两种方法可以实现。
一种是使用concat协议
ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
另一种是使用外置的文本文件,列出需要合并的文件的文件名,注意文件名需要时简单的按顺序排列的
比如
file 'input1.mkv'
file 'input2.mkv'
file 'input3.mkv'
或者
file '1.flv'
file '2.flv'
file '3.flv'
把文本文件保存为file.txt,然后执行下面这个命令:
ffmpeg -f concat -safe 0 -i .\file.txt -c copy output.mp4
其中-safe 0 是强制合并,无视安全警告的作用。
通常使用比较多的是方法二
powershell脚本的编写
使用方法二的时候,就需要对文件进行重命名,方法一似乎也是需要按顺序的简单文件名。
我这里的做法是,新建一个临时目录temp,在拷贝的时候重命名,这样之后进行的操作就都不会影响到源文件了,万一脚本出错,也没事。
因为需求比较简单,所以脚本脚本我写的也比较随便。没有提示性输出。并且也没有任何错误处理的措施。
用于拼接flv文件
param(
[string]$targetPath='.',
[string]$tempPath='temp',
[string]$sortMethod='CreationTime'
)
$flvregex='[\s\S]+.flv$'
function Get-FileList ($targetPath,$nameregex){
$filelist=Get-ChildItem -File -Filter $targetPath | where{$_.Name -match $nameregex}
return $filelist
}
$filelist = Get-FileList -targetPath $targetPath -nameregex $flvregex
if (-not( Test-Path $tempPath)){
mkdir $tempPath
}
$index=0
$filelist | Sort-Object -Property $sortMethod | foreach{$index+=1;Copy-Item $_ "$tempPath/$index.flv"; "file $index.flv"}| Out-File -Encoding ascii "$tempPath/file.txt"
ffmpeg -f concat -safe 0 -i "$tempPath/file.txt" -c copy output.mp4
网友评论