![FFmpeg 批量合并文件夹内的视频](https://linux22.com/image/1563662/FFmpeg%20%E6%89%B9%E9%87%8F%E5%90%88%E5%B9%B6%E6%96%87%E4%BB%B6%E5%A4%B9%E5%86%85%E7%9A%84%E8%A7%86%E9%A2%91.png)
我有一个文件夹,c:\myfolder\
里面有多变的mp4
具有相同分辨率/编解码器的文件数量。
现在我需要一个.bat 文件将所有视频合并为一个。
例如c:\myfolder\1.mp4, c:\myfolder\2.mp4, c:\myfolder\3.mp4
c:\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.mp4
,02-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。
运行此脚本的先决条件是安装ffmpeg和Python 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*