
.MOV
私は Arch Linux 4.13.10 を使用しており、 Canon EOS カメラで撮影した複数のファイルを結合したいと考えています。
.ts
FFmpegを使用してファイルをトランスポートストリーム(ファイル)に変換しようとしました。ここしかし、結果のファイルにはサウンドがありませんでした。
結果のファイルが であれば望ましいのです.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
。-1
1
フォーマットが自動的にプローブされた場合は と同等であり、そうでない場合は と同等です0
。この
-c copy
オプションは、ffmpeg
「コピー」コーデックを使用するように指示します。つまり、ビデオは再エンコードされません。これが高速化の理由です。
参考文献
- 私は勉強した@Matthias Braunの回答も。
\x27
私がキャラクターを制作する際に使用する答えは次のとおりです'
。Stack Overflow: 単一引用符で囲まれた文字列内の単一引用符をエスケープする方法- 上記のコマンドのニュアンスを理解しながら、VSCode テキスト エディターで GitHub Copilot AI と何度も対話しました。
- MP4 ファイルに対する私の回答:Stack Overflow: FFmpeg を使用して 2 つの MP4 ファイルを連結する方法は?