ffmpeg 无损合并分段视频方法,附powershell脚本

2020-03-06  本文已影响0人  mudssky

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 
上一篇下一篇

猜你喜欢

热点阅读