简体   繁体   中英

Concatenate / Join MP4 files using ffmpeg and windows command line batch NOT LINUX

I've written a batch script that attempts to take a generic introductory title video (MP4) that runs for 12 seconds and attaches it to the beginning of 4 other MP4 videos (same video but each has a different language audio track)

According to ffmpeg syntax here: http://ffmpeg.org/trac/ffmpeg/wiki/How%20to%20concatenate%20%28join,%20merge%29%20media%20files the concat demuxer needs to be run from a text file that looks like this:

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

I believe everything in my script up until the point of joining the files appears to be working correctly. But I get this error:

[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

I believe the issue lies in the text file I'm creating. Please excuse my n00b ignorance, but sometimes new script makers like myself get confused about developer jargon and may take things literally.

So when I look at that example text file they gave, am I correct in thinking THIS is what my text file should look like?

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

Again, am I being too literal? are the quotations correct? Are the slashes correct? In the example they provide the slashes in the path are / instead of normal windows \. I'll provide the entire script in case it helps.

@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

EDIT
Thanks to @foxidrive making me look at the simplicity of it... it occurred to me that Apparently I wasn't being literal enough. I made these 3 changes and script works perfectly now 1: "file" in there example literally meant the word "file" 2: needed the use of single quotes not double quotes as it shows in there example. 3: Used "\" instead of "/" as they have in there example.

So NOW my code to create the text files looks like this:

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
)

So NOW my text file looks like this:

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

From reading your question, I'd suggest that the configuration file might look like this:

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

It may need double quotes around the path\\filenames instead of single quotes, for Windows. Try it both ways.

OS Windows

Step 1: Create a file for example C:\\iAmAFile.txt with following contents and save it

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

Step 2: Download FFmpeg http://ffmpeg.zeranoe.com/builds/win32/static/ffmpeg-20140716-git-faafd1e-win32-static.7z . Unzip it, go to the folder and you will find a ff.prompt.bat file which is like command prompt open it.

在此输入图像描述

Step 3: now apply the tutorial command (Concat demuxer is more reliable it doe s not break the encoder/decoder just copy) 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

Done

multiplatform solution, using python:

(incomplete snippet)

combined = 'combined.mp4'
tempf = 'tempfile'
s = ''
for f in sys.argv[1:]:
    s += f"file '{f}'\n"
open(tempf, 'w').write(s)
cmd = f'ffmpeg -f concat -safe 0 -i {tempf} -c copy {combined}'
os.system(cmd)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM