美文网首页
ffmpeg 无损合并分段视频方法,附powershell脚本

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

作者: mudssky | 来源:发表于2020-03-06 02:22 被阅读0次

    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 
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/sqgerhtx.html