より短いコマンド

より短いコマンド

.MOV私は Arch Linux 4.13.10 を使用しており、 Canon EOS カメラで撮影した複数のファイルを結合したいと考えています。

.tsFFmpegを使用してファイルをトランスポートストリーム(ファイル)に変換しようとしました。ここしかし、結果のファイルにはサウンドがありませんでした。

結果のファイルが であれば望ましいのです.mp4が、これは厳密には必須ではありません。

どうすればいいですか?

答え1

ファイルの結合に成功しましたFFmpeg のデマルチプレクシング機能変換の場合.mp4、このエラーを回避するためにオーディオ ストリームを明示的に変換する必要がありました。

ストリーム #1 でコーデック pcm_s16le のタグが見つかりませんでした。コーデックは現在コンテナーでサポートされていません。

これは、ファイルを結合するコマンドですmerged.mp4:

ffmpeg -f concat -i files_to_combine.txt -vcodec copy -acodec aac -strict -2 -b:a 384k merged.mp4

出力ファイルもファイルである場合.MOV、コマンドは次のようになります。

ffmpeg -f concat -i files_to_combine.txt -vcodec copy -acodec copy merged.MOV

テキストファイルの内容は次のとおりですfiles_to_combine.txt

file ./first_file.MOV
file ./second_file.MOV

エラーが表示された場合

安全でないファイル名「file with spaces.mov」files_to_combine.txt: 操作は許可されていません

ファイル名を信頼している場合は、-safe 0このエラーを回避するために追加することができます。FFmpegのマニュアルページ:

ffmpeg -safe 0 -f concat ...

より短いコマンド

5年後に同じ課題に挑戦したところ、

ffmpeg -f concat -i files_to_combine.txt merged.mov

そして

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

答え2

find *.MOV | sed 's:\ :\\\ :g'| sed 's/^/file /' > fl.txt; ffmpeg -f concat -i fl.txt -c copy output.mp4; rm fl.txt

答え3

代わりにファイルを連結する方法を探している場合は.mp4、ここにある私の他の回答を参照してください:Stack Overflow: FFmpeg を使用して 2 つの MP4 ファイルを連結する方法は?

.mov複数のファイル.MOVを1つに結合する

...必要なことは次のとおりです:

# 0. Copy all .mov files that (you'd like to combine) into a single directory. 
# Then `cd` into that directory. 

# 1. Create a "files.txt" file containing a list of files to combine
find . -type f -iname "*.mov" | sort -V \
    | awk '{print "file \x27" $0 "\x27"}' > files.txt

# [WHAT I USUALLY USE: FAST]
# 2. **If all of your .mov files have the same encoding** (ex: they were 
# all recorded on the same video camera and with the same settings), you can
# specify to use the "copy" codec via `-c copy`, which means it will NOT 
# have to re-encode the video. This just concatenates all the files together. 
# THIS TAKES **SECONDS**. 
time ffmpeg -f concat -safe 0 -i files.txt -c copy merged.mov 

# [SLOW; SOMETIMES NECESSARY]
# OR 2. **If each of your .mov files has a different encoding,** you'll need to 
# re-encode them all into a single stream. 
# - This uses the "files.txt" file created above, and outputs the merged 
#   file into "merged.mov". 
# THIS COULD TAKE **HOURS**. 
time ffmpeg -f concat -safe 0 -i files.txt merged.mov

私は通常、最初のオプションを使用できる状況にあります。の代わりに時間それは素晴らしいですね!

追加の詳細と説明

  • 次のファイルがあることが示されている場合ls -1:

    REC_0009.MOV
    REC_0010.MOV
    REC_0011.MOV
    

    すると、findコマンドによって次のファイルが生成されますfiles.txt

    file './REC_0009.MOV'
    file './REC_0010.MOV'
    file './REC_0011.MOV'
    
  • その-iname "*.mov"部分はケースを.movまたは.MOV、またはその他の大文字の組み合わせで終わるすべてのファイルに一致します。

  • -safe 0コマンドを忘れた場合ffmpeg、ファイル名のいずれかにeven形式の「ディレクトリ」が含まれていると./、次のようなエラーが発生します。

    [concat @ 0x555a24968700] Unsafe file name './REC_0009.MOV'
    files.txt: Operation not permitted
    

    この-safe 0オプションはffmpeg、このエラーを無視し、ファイルパス内の「安全でない」ディレクトリを受け入れるように指示します。

    @Matthias Braun がここでそれについて言及しています。

    ffmpegマニュアルページよりオンラインのみないman ffmpeg私の Linux Ubuntu 20.04 コンピュータのローカルのマニュアル ページでは、次のようになっています:ffmpeg の最新バージョンは、こちらです。:

    safe

    に設定すると1、安全でないファイル パスを拒否します。ファイル パスは、プロトコル仕様が含まれず、相対的であり、すべてのコンポーネントにポータブル文字セット (文字、数字、ピリオド、アンダースコア、ハイフン) の文字のみが含まれ、コンポーネントの先頭にピリオドがない場合に安全であると見なされます。

    に設定すると0、任意のファイル名が受け入れられます。

    デフォルトは です1

    -11フォーマットが自動的にプローブされた場合は と同等であり、そうでない場合は と同等です0

  • この-c copyオプションは、ffmpeg「コピー」コーデックを使用するように指示します。つまり、ビデオは再エンコードされません。これが高速化の理由です。

参考文献

  1. 私は勉強した@Matthias Braunの回答も
  2. \x27私がキャラクターを制作する際に使用する答えは次のとおりです'Stack Overflow: 単一引用符で囲まれた文字列内の単一引用符をエスケープする方法
  3. 上記のコマンドのニュアンスを理解しながら、VSCode テキスト エディターで GitHub Copilot AI と何度も対話しました。
  4. MP4 ファイルに対する私の回答:Stack Overflow: FFmpeg を使用して 2 つの MP4 ファイルを連結する方法は?

関連情報