使用ffmpeg和windows命令行批处理NOT LINUX连接/加入MP4文件

时间:2013-08-27 19:55:32

标签: windows video batch-file ffmpeg concatenation

我已经编写了一个批处理脚本,试图获取一个运行12秒的通用介绍性标题视频(MP4)并将其附加到其他4个MP4视频的开头(相同的视频但每个都有不同的语言音轨)

根据这里的ffmpeg语法:http://ffmpeg.org/trac/ffmpeg/wiki/How%20to%20concatenate%20%28join,%20merge%29%20media%20files concat demuxer需要从一个如下所示的文本文件中运行:

# this is a comment
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

我相信我的脚本中的所有内容都会在加入文件之前显示正常工作。但是我得到了这个错误:

[concat @ 04177d00] Line 2: unknown keyword ''C:\Users\Joe\1May\session3\readyforfinalconversion\frenchfile.mp4'
filelistFrench.txt: Invalid data found when processing input
[concat @ 03b70a80] Line 2: unknown keyword ''C:\Users\Joe\1May\session3\readyforfinalconversion\spanishfile.mp4'
filelistSpanish.txt: Invalid data found when processing input
[concat @ 0211b960] Line 2: unknown keyword ''C:\Users\Joe\1May\session3\readyforfinalconversion\basquefile.mp4'
filelistBasque.txt: Invalid data found when processing input
[concat @ 03a20a80] Line 2: unknown keyword ''C:\Users\Joe\1May\session3\readyforfinalconversion\Englishfile.mp4'
filelistEnglish.txt: Invalid data found when processing input

我认为问题出在我正在创建的文本文件中。请原谅我的无知,但有时像我这样的新脚本制作者对开发人员的术语感到困惑,可能会从字面上理解。

因此,当我查看他们提供的示例文本文件时,我是否正确认为这是我的文本文件应该是什么样的?

# this is a comment
Titlefile.mp4 'C:\Users\Joe\1May\session3\readyforfinalconversion\Titlefile.mp4'
Englishfile.mp4 'C:\Users\Joe\1May\session3\readyforfinalconversion\Englishfile.mp4'

再一次,我是不是太字面了?报价是否正确?斜线是否正确?在示例中,它们提供路径中的斜杠/而不是普通的Windows \。我将提供整个脚本以防万一。

@echo off

setlocal EnableDelayedExpansion

rem Create an array of languages
set i=0
for %%a in (French Spanish Basque English) do (
   set /A i+=1
   set term[!i!]=%%a
)

rem Get the title video file name from user

set /p titlevideofilename=What is the title video file 

name?

rem create a path variable for the title video file

set pathtotitlevideo=%~dp0%titlevideofilename%

rem Get the names of the different language video files to append to the title video
rem create a path variable for each different language video files

for /L %%i in (1,1,4) do (
   set /p language[%%i]=what is the name of the !term

[%%i]! file you want to append after the title video?
   set pathtofile[%%i]=%~dp0!language[%%i]!
)

rem create data file for ffmpeg based on variable data

for /L %%i in (1,1,4) do (
    echo # this is a comment>>filelist!term[%

%i]!.txt
    echo file '%pathtotitlevideo%'>>filelist!term[%

%i]!.txt
    echo file '!pathtofile[%%i]!'>>filelist!term[%

%i]!.txt
)

cls

rem join files using ffmpeg concat option

for /L %%i in (1,1,4) do (
   c:\ffmpeg\ffmpeg\bin\ffmpeg.exe -loglevel error -f 

concat -i filelist!term[%%i]!.txt -c copy !language[%

%i]!.!term[%%i]!.withtitle.mp4
)

endlocal

:eof
exit

修改
感谢@foxidrive让我看看它的简洁性...我突然意识到我显然不够文字。我做了这3个更改,脚本现在完美运行了 1:示例中的“文件”字面意思是“文件”这个词 2:需要使用单引号而不是双引号,如示例中所示。 3:在示例中使用“\”而不是“/”。

所以现在我创建文本文件的代码如下所示:

rem create data file for ffmpeg based on variable data

for /L %%i in (1,1,4) do (
    echo # this is a comment>>filelist!term[%

%i]!.txt
    echo file '%pathtotitlevideo%'>>filelist!term[%

%i]!.txt
    echo file '!pathtofile[%%i]!'>>filelist!term[%

%i]!.txt
)

现在,我的文本文件如下所示:

# this is a comment    
file 'C:\Users\Joe\1May\session3\readyforfinalconversion\Titlefile.mp4'
file 'C:\Users\Joe\1May\session3\readyforfinalconversion\Englishfile.mp4'

2 个答案:

答案 0 :(得分:6)

通过阅读您的问题,我建议配置文件可能如下所示:

# this is a comment
file 'C:\Users\Joe\1May\session3\readyforfinalconversion\Titlefile.mp4'
file 'C:\Users\Joe\1May\session3\readyforfinalconversion\Englishfile.mp4'

对于Windows,它可能需要围绕路径\文件名而不是单引号使用双引号。尝试两种方式。

答案 1 :(得分:2)

OS Windows

步骤1:创建一个文件,例如C:\ iAmAFile.txt,其中包含以下内容并保存

file 'C:\video1.flv'
file 'C:\video2.flv'

第2步:下载FFmpeg http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20140716-git-faafd1e-win32-static.7z。解压缩它,转到该文件夹​​,你会发现一个ff.prompt.bat文件就像命令提示符一样打开它。

enter image description here

步骤3:现在应用教程命令(Concat demuxer更可靠,它不会破坏编码器/解码器只是复制)https://trac.ffmpeg.org/wiki/How%20to%20concatenate%20(join,%20merge)%20media%20files#demuxer

> ffmpeg -f concat -i C:\iAmAFile.txt -c copy C:\output.flv

完成