FFmpeg 批量合并文件夹内的视频

FFmpeg 批量合并文件夹内的视频

我有一个文件夹,c:\myfolder\里面有多变的mp4具有相同分辨率/编解码器的文件数量。

现在我需要一个.bat 文件将所有视频合并为一个。

例如c:\myfolder\1.mp4, c:\myfolder\2.mp4, c:\myfolder\3.mp4c:\myfolder\output.mp4

我找到了一种方法来做到这一点,即.txt首先创建一个包含所有输入视频的文件,然后在另一个步骤中执行

ffmpeg.exe -f concat -i mylist.txt -c copy output.mp4

问:有没有办法一步完成这个?

答案1

对于使用(Linux / Mac)的用户bash,这里有一个脚本可以生成文件夹中所有文件的列表,然后将其全部合并为一个视频文件:

#!/bin/bash
for filename in pieces/*.mp4; do
  echo "file $filename" >> concat-list.txt
done

ffmpeg -f concat -i concat-list.txt merged.mp4

echo "Concatenated videos list:"
cat concat-list.txt
rm concat-list.txt

它从文件夹中获取所有mp4文件pieces/并将视频连接到merged.mp4文件中。

文件列表按字母顺序生成,因此如果您希望视频按特定顺序排列,请将其命名为01-murder-scene.mp402-office-scene.mp4等等。

答案2

由于我没有在这台电脑上安装 ffmpeg,因此未经测试:

:: Q:\Test\2018\06\20\SU_1332169.cmd
@Echo off
Set "BaseDir=c:\myfolder"
Set "OutMp4=%BaseDir%\Output.mp4"
Set "FfmpegCue=%Temp%\Ffmpeg.Cue"

:: gather files but exclude evt. present output file
( For /f "Delims=" %%A in (
  'Dir /B/S/A-D/ON "%BaseDir%\*.mp4" 2^>NUL ^|findstr /VLI "%OutMp4%" '
  ) Do Echo=%%A
) > "%FfmpegCue%"

:: Just to show what's in the cue file:
more "%FfmpegCue%"
Pause

:: Do the concat
ffmpeg.exe -f concat -i "%FfmpegCue%" -c copy "%OutMp4%" && (
  Echo Successfully created "%OutMp4%"
  choice /M "Delete %FfmegCue% "
  If not Errorlevel 2 Del "%FfmegCue%"
) || (echo ffmpeg exited with error)

答案3

这是用于 Windows 的快速 Python 脚本,用于合并 mp4 文件。它根据创建时间(从最旧到最新)对文件进行排序,但您可以修改脚本以更改排序过程。

就我而言,我使用光子发射站我正在一个接一个地创建多个短片。该脚本可以很好地将它们组合成一个 mp4 文件。对于不需要任何编辑的快速而粗糙的工作,使用此脚本比使用编辑程序要快得多DaVinci Resolve

运行此脚本的先决条件是安装ffmpegPython 3. 必须将 ffmpeg 添加到您的Windows 路径如果安装时没有自动添加。

#!/usr/bin/env python3
import os
import glob

# Create list of all .mp4 files in current working directory.
files = list(filter(os.path.isfile, glob.glob(os.path.join(os.getcwd(), '*.mp4'))))
files.sort(key=lambda x: os.path.getctime(x))

# Write list to text file that ffmpeg reads next.
with open('files.txt', 'w') as output:
    for file in files:
        output.write("file '" + file + "'\n")

# Run ffmpeg to concatenate the .mp4 files.
os.system('ffmpeg -f concat -safe 0 -i files.txt merged.mp4')

# Delete the text file.
os.remove('files.txt')

答案4

这可能不是最好的解决方案,因为它会创建临时文件。但我想为人们提供一个直接的答案作为替代方案:

#!/usr/bin/env bash
# Synopsis: Combine any input videos to a mp4 file.
# Usage: ffmpeg-combine-videos input_video1 input input_video2 ...

n=0

rm -f __input*
> __input.list

for i in "$@";do
    I=__input${n}.ts
    ffmpeg -i "$i" -c:v h264 -b:v ${VIDEO_BITRATE:-400k} -c:a libmp3lame -f mpegts "$I"
    echo "file $I" >> __input.list
    n=$((n+1))
done

ffmpeg -f concat -safe 0 -i __input.list -c copy combined.mp4

rm -f __input*

相关内容