インタラクティブにビデオファイルを連結する


9

複数のMP4ビデオファイルをインタラクティブに1つのファイルに連結(結合)する方法

コマンドラインから2つのファイルに対してこれを行うプログラムはたくさんあります。例えば:

  • ffmpeg
  • avconv
  • MP4Box

しかし、これをインタラクティブに行うためのソリューションが必要になることがよくあります。


1
インタラクティブとはどういう意味ですか?
slm

@slm入力ファイルを1つずつ入力し、次に出力ファイルを作成するようユーザーに要求するプログラムを意味します。そして、連結を行います。
Slyx 2014

これを直接行うプログラムを見たことはありません。これは、作成したとおり、情報を収集してコマンドラインを組み立てるシェルスクリプトです。自分が持っているものに対する改善を探していますか?
slm

@slm私がこれを投稿したのは、私のようなマルチメディアユーザーにとって頻繁に必要になるためです。だから私はそれが他の誰かを助けることを願っています。もちろん、どんな改善でも大歓迎です!
Slyx 2014

1
@gold編集をキューに入れました。ffmpeg確かに、死んだり時代遅れになったりすることは決してありません。最後のgitコミットmaster15分前で、毎日使用しています。
Anko 14

回答:


8

私は最近この方法を試していませんが、それでも機能しない理由はわかりません。cat .mp4連結する以外に何もしたくない場合は、ファイルをまとめることができると思います。

1.猫を使う

$ cat file1.mp4 file2.mp4 > file3.mp4
$ ffmpeg -i file3.mp4 -qscale:v 2 output.avi

私は今でもffmpegずっと使用しています。ファイルを連結することもできます。

2. ffmpegの使用

  1. 連結するファイルのリストを作成する

    $ cat inputs.txt 
    file sample_mpeg4.mp4
    file sample_mpeg4.mp4
    
  2. 連結する

    $ 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オプションはここに記載されています


面白い !私はそれcatがMP4ファイルに十分であることを知りませんでした!ただし、このソリューションはインタラクティブではありません。
Slyx 2014

@Slyx-そうですね、そういうわけで、インタラクティブとはどういう意味かを尋ねました。あなたがそれについて言ったことを見てみましょう、そして私がこれに何を追加できるか見てみましょう。それが機能することを確認してくださいcat。私がそれを最後に使用したのは、.mpgファイルとデフでした。それらと働いた。
slm

2
確認しました。を使用することcatは有効な解決策ではありません。cat2つのファイルを結合して生成されたファイルには、最初の入力ファイルの内容のみが表示されます。
Slyx 2014

@Slyx-猫は機能しますが、タイムスタンプが正しくないため、再生しようとすると、ビデオプレーヤーは00から最後までのタイムスタンプのジャンプによって混乱し、その後00に戻ります。ビデオをトランスコードすると、このそのプロセスの一部として修正されます。タイムスタンプを再生成する方法もあります。
slm

それも私が言いたいことです。2つのコンテンツは存在しますが、メディアプレーヤーは最初のコンテンツを検出するだけです。
Slyx 2014

4

私は作業ベースとして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 !"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.