各20個のバッチサイズでビデオをマージします。 Linuxマシンを実行しています。ビデオはmp4形式で、中程度の品質です。オーディオストリームが欠落している場合もあります。これまでのところ、ffmpeg
、mencoder
、cvlc/vlc
、およびMP4Box
を試しました。私はバッチ処理を行っているので、これを達成するためにコマンドラインスクリプトを書きたいです。
主な問題は、私が試したいくつかのソリューションが2つのビデオでうまく機能すること、オーディオストリームを含むビデオでうまく機能すること、そしてビデオセットの他のサブセットでうまく機能することです。しかし、私はこのタスクの包括的なソリューションを見つけることができませんでした。
これで問題が解決しました: https://stackoverflow.com/a/22324018/5014767
melt
は、このための優れたコマンドラインユーティリティです。 ここ はページです
コメントから編集:私の問題を解決したコマンドはこれでしたmelt {input-sequence} -consumer avformat:{output-name} acodec=libmp3lame vcodec=libx264
mkvmerge
を使用して、複数のMP4ファイルを1つのファイルに結合しています。
mkvmerge -o outfile.mkv infile_01.mp4 \+ infile_02.mp4 \+ infile_03.mp4
Ffmpegを使用してトランスコーディングせずにMP4を連結するための小さなシェルスクリプトを作成しました。
for f in $(ls *.MP4); do
ffmpeg -i $f -c copy -bsf:v h264_mp4toannexb -f mpegts $f.ts
done
CONCAT=$(echo $(ls *.ts) | sed -e "s/ /|/g")
ffmpeg -i "concat:$CONCAT" -c copy -bsf:a aac_adtstoasc output.mp4
rm *.ts
これにより、MPEGコンテナに中間ファイルが作成され、それらがMP4に連結されます。
純粋にbash
およびffmpeg
のスクリプト。コマンドラインで指定されたファイルを1つに再エンコードします。
ファイルは同じ解像度である必要があります。 ffmpeg concat:
がサポートしないさまざまなメタデータのローテーションを受け入れます。
rm ffmpeg-concat-output.mkv
FILE_COUNT=$#
INPUTS=""
FILTER=""
INDEX=0
for FNAME in $@; do
echo "Processing ${FNAME}"
INPUTS="${INPUTS} -i $FNAME"
if [ -z "${FILTER}" ]; then
FILTER="[$INDEX:v:0] [$INDEX:a:0]"
else
FILTER="${FILTER} [$INDEX:v:0] [$INDEX:a:0]"
fi
let INDEX+=1
done
COMMAND="ffmpeg ${INPUTS} \
-filter_complex '${FILTER} \
concat=n=${INDEX}:v=1:a=1 [v] [a]' \
-map '[v]' -map '[a]' \
ffmpeg-concat-output.mkv"
# -af 'volume=15dB' # won't work with -filter_complex
bash -c "${COMMAND}"
Pythonスクリプト を作成しました。これは moviepy を使用して、サブセグメントも連結できます(たとえば、ビデオから一部を削除する場合に便利です)。
以下で使用します:
vcat -i inputfile1,inputfile2[start-end],... -o <outputfile>