複数のMP4ビデオファイルを1つのファイルにインタラクティブに連結(結合)する方法は?
コマンドラインから2つのファイルに対してこれを行うプログラムはたくさんあります。例えば:
しかし、これをインタラクティブに行うためのソリューションが必要になることがよくあります。
私はMP4Boxを作業ベースとして使用しています。
私が提案するスクリプトは、すべてのファイルを1つずつ読み取り、各ファイルを検証し(通常のファイルである場合)、作成する入力ファイル名をユーザーに要求します。
#!/bin/bash
printf "### Concatenate Media files ###\n"
fInputCount=0
# Reading input files
IFS=''
while (true)
do
let currentNumber=$fInputCount+1
printf "File n°%s (\"ok\" to finish): " $currentNumber
read inputFile
[ "$inputFile" == "ok" ] && break
[ ! -e "$inputFile" ] || [ ! -f "$inputFile" ] && printf "\"%s\" : Invalid filename. Skipped !\n" "$inputFile" && continue
((fInputCount++))
inputFileList[$fInputCount]=$inputFile
printf "\"%s\" : Added to queue !\n" "$inputFile"
done
[ "$fInputCount" == "0" ] || [ "$fInputCount" == "1" ] && echo "No enough input data. BYE ! " && exit
# Listing the input file list
for ((i=1;i<=$fInputCount;i++))
do
printf "%2d : %s\n" $i ${inputFileList[$i]}
done
# Reading the output filename
while (true)
do
printf "Output file without extention (\"none\" to dismiss) : "
read outputRead
[ "$outputRead" == "none" ] && echo "Dismissed. BYE ! " && exit
[ "$outputRead" == "" ] && echo "Try again ! " && continue
[ -e "$outputRead" ] && echo "\"$outputRead\" exists. Try again !" && continue
outputFile=$outputRead.mp4
echo "Output to \"$outputFile\". Go !" && break
done
# Creating a random temporary filename
tmpOutFile="/tmp/concatMedia"`date +"%s%N"| sha1sum | awk '{print $1}'`".mp4"
# Joining the two first input files
MP4Box -cat "${inputFileList[1]}" -cat "${inputFileList[2]}" $tmpOutFile
# Adding all other files
for ((i=3;i<=$fInputCount;i++))
do
tmpIntermediateFile=$tmpOutFile
tmpOutFile="/tmp/concatMedia"`date +"%s%N"| sha1sum | awk '{print $1}'`".mp4"
MP4Box -cat $tmpIntermediateFile -cat "${inputFileList[$i]}" $tmpOutFile
rm $tmpIntermediateFile
done
mv $tmpOutFile "$outputFile"
# Finished
echo "\"$outputFile\" Saved !"
私は最近この方法を試していませんが、それでも機能しない理由はわかりません。 cat
.mp4
ファイルを連結する以外に何もしたくない場合は、ファイルをまとめます。
$ cat file1.mp4 file2.mp4 > file3.mp4
$ ffmpeg -i file3.mp4 -qscale:v 2 output.avi
私は今でもffmpeg
を常に使用しています。ファイルを連結することもできます。
連結するファイルのリストを作成する
$ cat inputs.txt
file sample_mpeg4.mp4
file sample_mpeg4.mp4
連結する
$ ffmpeg -f concat -i inputs.txt -c copy out.mp4
$ ll |grep -E "sample|out"
-rw-rw-r--. 1 saml saml 491860 Feb 19 23:36 out.mp4
-rw-r--r--. 1 saml saml 245779 Feb 19 23:32 sample_mpeg4.mp4
他の方法はFFmpeg wikiでカバーされています: メディアファイルを連結(結合、マージ)する方法 。
注:Ubuntuはconcat
形式をサポートしていないようです。 concatプロトコルを使用する必要があります。さらに、ストリームごとのコーデックオプションがあります。したがって、concatプロトコルを使用すると、次のようになります。
$ ffmpeg -i input1.mp4 -vcodec copy -acodec copy \
-vbsf h264_mp4toannexb -f mpegts intermediate1.ts
$ ffmpeg -i input2.mp4 -vcodec copy -acodec copy \
-vbsf h264_mp4toannexb -f mpegts intermediate2.ts
$ ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" \
-vcodec copy -acodec copy -absf aac_adtstoasc output.mp4
Ubuntuのffmpegオプションは文書化されています ここ 。