ffmpeg concat:「安全でないファイル名」


83

たくさんのmtsファイルを大きなmp4ファイルに変換しようとしています:

stephan@rechenmonster:/mnt/backupsystem/archive2/Videos/20151222/PRIVATE/AVCHD/BDMV$ ~/bin/ffmpeg-git-20160817-64bit-static/ffmpeg -v info -f concat -i <(find STREAM -name '*' -printf "file '$PWD/%p'\n") -deinterlace -r 25 -s hd720 -c:v libx264 -crf 23 -acodec copy -strict -2 ~/tmp/Videos/20151222.mp4
ffmpeg version N-81364-gf85842b-static http://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.1 (Debian 5.4.1-1) 20160803
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libwebp --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libfreetype --enable-fontconfig --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-amrwbenc --enable-gray --enable-libopenjpeg --enable-libopus --enable-libass --enable-gnutls --enable-libvidstab --enable-libsoxr --enable-frei0r --enable-libfribidi --disable-indev=sndio --disable-outdev=sndio --enable-librtmp --enable-libmfx --enable-libzimg --cc=gcc-5
  libavutil      55. 28.100 / 55. 28.100
  libavcodec     57. 53.100 / 57. 53.100
  libavformat    57. 46.101 / 57. 46.101
  libavdevice    57.  0.102 / 57.  0.102
  libavfilter     6. 51.100 /  6. 51.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
  libpostproc    54.  0.100 / 54.  0.100
[concat @ 0x56054a0] Unsafe file name '/mnt/backupsystem/archive2/Videos/20151222/PRIVATE/AVCHD/BDMV/STREAM'
/dev/fd/63: Operation not permitted

ここで何がうまくいかないのですか?この文脈で「安全でないファイル」という用語はどういう意味ですか?


49
-safe 0前に追加し-iます。ffmpeg.org/ffmpeg-all.html#Options-31
Gyan

回答:


85

@Mulvya(ありがとう!)が述べた答えは機能します:「-safe 0前に追加-i」。次にfind STREAM -name '*' -printf "file '$PWD/%p'\n"、最初のエントリとして空のパスを返す別の問題が発生しました。これをfor f in ./*.wav; do echo "file '$PWD/$f'"; donehttps://trac.ffmpeg.org/wiki/Concatenateを参照)に変更し、現在は機能しているようです。やあ!


1
findサブコマンドをに変更することもできますfind STREAM -type f -name '*' -printf "file '$PWD/%p'\n"(そして-safe 0、ffmpegコマンドにを追加することを忘れないでください)。
erik 2016

17

その理由に答えるには、入力ファイルからマルチメディアストリームを読み取るffmpegのデマルチプレクサの動作を確認する必要があります。この場合、次のオプションを使用して「concat」を使用しています:(アーカイブされたドキュメント)

このデマルチプレクサは、次のオプションを受け入れます。

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

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

デフォルトは1です。

-1は、フォーマットが自動的にプローブされた場合は1に相当し、それ以外の場合は0に相当します。

ファイルの前にをfind .置くことがわかりました./unix「find」の先頭の「./」を削除する方法を参照してくださいを使用したくない場合の解決策について-safe 0


16

@sersの答えは完全に正しいです。コマンドを表示するだけなので、他の場所に-safe0を配置しないでください。

ffmpeg.exe -f concat -safe 0 -i "clips.txt" -c copy "video.mp4"

11

私の場合、二重引用符でエラーが発生します。

連結する入力ファイルのリストを含むffmpeg -f concat -i concat.txt -c copy output.m4aコマンドを使用しconcat.txtます。

安全でないファイル名(二重引用符はファイル名の一部として扱われ、-safe 0これを修正することはできません):

file "song1.m4a"
file "song2.m4a"

安全なファイル名(一重引用符):

file 'song1.m4a'
file 'song2.m4a'

安全なファイル名(引用符なし):

file song1.m4a
file song2.m4a

上記の一重引用符引用符なしは、「文字、数字、ピリオド(プレフィックスを除く)、アンダースコア、ハイフン」のみが含まれている場合にのみ安全です。したがって、次の一般的なファイル名は機能しません。

  • スペース
  • グリフ
  • / (道)
  • プレフィックス期間(隠しファイル)

あなたはまだ-safe 0その場合に必要です。

[引用と脱出に関する警告]

'ファイル名の一部には常にエスケープが必要です。その理由は、にfile Im' .avi終了引用符が自動的に追加されるためです。Im' .avi'これはfile Im' .avi'。と同じです。の最後の奇数引用符file Im' .avi''''''も追加され、終了引用符がになりますfile Im' .avi'''''''ので、No such file or directoryエラーはありません。スペース\が一重引用符で始まる接頭辞の後にエスケープする必要がなくなったため、この現象を理解しました。終了引用符を追加する必要はありません。

上記にも関わらず(でエスケープ'する必要があり、でエスケープすること\はできません")、エスケープスタイルはシェルに似ています。ファイル名に一重引用符が含まれている場合は、I\'m\ .m4a(一重引用符で囲まれていない)スタイルまたは'I'\''m .m4a'OR 'I'\''m'\ '.m4a'(一重引用符で囲まれている)スタイルのいずれかでエスケープできますが、どちら'I\'m\ .m4a'でもありません'I'm .m4a'

ffmpegをテストするときは、最初の行のエラーメッセージImpossible to openが誤解を招く可能性がある(ファイルが存在する)ことに注意してください。No such file or directory(ファイルが存在しない)またはInvalid data found when processing input(無効なメディアファイル)のいずれかである2番目の行を確認する必要があります。


1
各ファイル名の前にファイルを追加すると、テキストファイルのファイルを使用する際の問題が解決しました。
hdoghmen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.