ffmpeg concat +处理+检查有效avi文件时发现的无效数据

时间:2015-07-11 03:29:51

标签: batch-file ffmpeg video-processing

我使用ffmpeg将多个avi文件连接(合并)到一个avi文件。 我使用以下命令。

ffmpeg -f concat -i mylist.txt -c copy out.avi

要合并的文件列表在mylist.txt

中给出
Ex 'mylist.txt':
 file 'v01.avi'
 file 'v02.avi'
 file 'v03.avi'
...
 file 'vxx.avi'

但是,当其中一个文件损坏(或为空)时会出现问题。 在这种情况下,视频仅包含损坏文件的文件。

在这种情况下,ffmpeg会返回以下错误:

[concat @ 02b2ac80] Impossible to open 'v24.avi'
mylist.txt: Invalid data found when processing input

Q1)有没有办法告诉ffmpeg即使遇到无效文件也继续合并?

或者,我决定编写一个批处理文件,在进行合并之前检查我的avi文件是否有效。 我的第二个问题是这个操作需要更多的时间来进行合并。

Q2)有没有快速的方法来检查ffmpeg是否有多个avi文件有效? (如果它们无效,则删除,忽略或重命名)。

提前感谢您的意见。

ssinfod。

有关信息,这是我当前的DOS批处理文件。 (这个批处理工作但很慢,因为ffprobe检查我的avi是否有效)

GO.BAT

@ECHO OFF
echo.
echo == MERGING STARTED ==
echo.
set f=C:\myfolder
set outfile=output.avi
set listfile=mylist.txt
set count=1

if exist %listfile% call :deletelistfile
if exist %outfile% call :deleteoutfile

echo == Checking if avi is valid (with ffprobe) ==
for %%f in (*.avi) DO (
    call ffprobe -v error %%f
    if errorlevel 1 (
        echo "ERROR:Corrupted file"
        move %%f %%f.bad
        del %%f
    )
)

echo == List avi files to convert in listfile ==
for %%f in (*.avi) DO (
    echo file '%%f' >> %listfile%
    set /a count+=1
)
ffmpeg -v error -f concat -i mylist.txt -c copy %outfile%
echo.
echo == MERGING COMPLETED ==
echo.
GOTO :EOF

:deletelistfile
 echo "Deleting mylist.txt"
 del %listfile%
GOTO :EOF

:deleteoutfile
 echo "Deleting output.avi"
 del %outfile%
GOTO :EOF

:EOF

1 个答案:

答案 0 :(得分:1)

如果在操作期间发生任何错误,我认为ffmpeg以退出值大于0结束。我没有安装ffmpeg因此无法验证它。

因此,我认为列表中的所有AVI文件在首次运行ffmpeg时都有效,以便进行连接。然后检查分配给errorlevel的返回代码。

如果返回代码为0,则所有AVI文件的串联都成功,并且可以退出批处理。

否则,使用更耗时的代码来找出哪些AVI文件无效,将它们排序并连接剩余的AVI文件。

因此批处理文件可能如下所示(未经测试):

@echo off
set "ListFile=%TEMP%\mylist.txt"
set "OutputFile=output.avi"

:PrepareMerge
if exist "%ListFile%" call :DeleteListFile
if exist "%OutputFile%" call :DeleteOutputFile

echo == List avi files to convert into list file ==
for %%F in (*.avi) do echo file '%%~fF'>>"%ListFile%"
if not exist "%ListFile%" goto CleanUp

echo == Merge the avi files to output file ==
ffmpeg.exe -v error -f concat -i "%ListFile%" -c copy "%OutputFile%"
if not errorlevel 1 goto Success

echo.
echo =================================================
echo ERROR: One or more avi files are corrupt.
echo =================================================
echo.

echo == Checking which avi are valid (with ffprobe) ==
for %%F in (*.avi) do (
    ffprobe.exe -v error "%%~fF"
    if errorlevel 1 (
        echo Corrupt file: %%~nxF
        ren "%%~fF" "%%~nF.bad"
    )
)
goto PrepareMerge

:DeleteListFile
echo Deleting list file.
del "%ListFile%"
goto :EOF

:DeleteOutputFile
echo Deleting output file.
del "%OutputFile%"
goto :EOF

:Success
echo == MERGING COMPLETED ==
call :DeleteListFile

:CleanUp
set "ListFile="
set "OutputFile="

if not errorlevel 1表示如果errorlevel不大于或等于1,则表示为0(或为负)。