ffmpeg concat: "Unsicherer Dateiname"

89

Der Versuch, eine Reihe von MTS-Dateien in eine große MP4-Datei zu konvertieren:

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

Irgendwelche Ideen, was hier schief geht? Was bedeutet der Begriff "unsichere Datei" in diesem Zusammenhang?

sers
quelle
50
-safe 0Vorher hinzufügen -i. Siehe ffmpeg.org/ffmpeg-all.html#Options-31
Gyan

Antworten:

88

Die Antwort von @Mulvya (danke!) Lautet: " -safe 0Vorher hinzufügen -i". Dann trat ein anderes Problem auf, bei find STREAM -name '*' -printf "file '$PWD/%p'\n"dem der leere Pfad als erster Eintrag zurückgegeben wird. Dies wurde geändert für for f in ./*.wav; do echo "file '$PWD/$f'"; done(siehe https://trac.ffmpeg.org/wiki/Concatenate ) und jetzt scheint es zu funktionieren. Hurra!

sers
quelle
1
Sie können auch den findUnterbefehl in ändern find STREAM -type f -name '*' -printf "file '$PWD/%p'\n"(und vergessen Sie nicht -safe 0, den Befehl zum Befehl ffmpeg hinzuzufügen ).
Erik
17

Um zu beantworten, warum, müssen wir die Funktionsweise der ffmpeg-Demuxer sehen, die die Multimedia-Streams aus einer Eingabedatei lesen. In diesem Fall verwenden wir "concat" mit den folgenden Optionen: (archivierte Dokumente)

Dieser Demuxer akzeptiert die folgende Option:

safeWenn auf 1 gesetzt, lehnen Sie unsichere Dateipfade ab. Ein Dateipfad gilt als sicher, wenn er keine Protokollspezifikation enthält und relativ ist und alle Komponenten nur Zeichen aus dem tragbaren Zeichensatz (Buchstaben, Ziffern, Punkt, Unterstrich und Bindestrich) enthalten und am Anfang einer Komponente keinen Punkt haben.

Wenn auf 0 gesetzt, wird jeder Dateiname akzeptiert.

Der Standardwert ist 1.

-1 entspricht 1, wenn das Format automatisch geprüft wurde, andernfalls 0.

Es stellt sich heraus, dass find .ein ./vor die Datei gestellt wird. Siehe Wie man führende "./" in Unix "find" entfernt? für Lösungen, wenn Sie nicht verwenden möchten -safe 0.

qwr
quelle
16

@sers Antwort ist völlig richtig Ich zeige Ihnen nur Befehl, damit Sie -safe 0 nirgendwo anders setzen.

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

In meinem Fall verursachen doppelte Anführungszeichen den Fehler.

Ich benutze ffmpeg -f concat -i concat.txt -c copy output.m4aBefehl, der die concat.txtListe der Eingabedateien enthält, um zu konkatieren.

Unsicherer Dateiname (doppelte Anführungszeichen werden als Teil des Dateinamens behandelt, -safe 0können dies nicht beheben):

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

Sicherer Dateiname (einfache Anführungszeichen):

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

Sicherer Dateiname (ohne Anführungszeichen):

file song1.m4a
file song2.m4a

Die obigen einfachen Anführungszeichen und ohne Anführungszeichen sind nur dann sicher, wenn sie nur "Buchstaben, Ziffern, Punkt (außer Präfix), Unterstrich und Bindestrich" enthalten . Der folgende allgemeine Dateiname funktioniert also nicht:

  • Raum
  • Glyphe
  • / (Pfad)
  • Präfixzeitraum (versteckte Datei)

Sie brauchen noch -safe 0für diese Fälle.

[Vorbehalt zum Zitieren und Entkommen]

Sie müssen immer 'im Teil des Dateinamens entkommen . Der Grund dafür ist, dassfile Im' .avidas Abschlussangebot automatisch hinzugefügt wirdIm' .avi', was dasselbe ist wiefile Im' .avi'. Das letzte ungerade Anführungszeichen infile Im' .avi''''''fügt auch schließende Anführungszeichen hinzufile Im' .avi''''''', so dass es keinenNo such file or directoryFehler gibt. Ich finde dieses Phänomen heraus, weil der Platz\nach dem Präfix mit einem einfachen Anführungszeichennicht mehrdurchgehen muss, ohne ein abschließendes Anführungszeichen hinzufügen zu müssen.

Trotz oberhalb von (muss entweichen 'durch \und nicht zu entkommen mit "), ist die Flucht Stil ähnlich zu schälen . Wenn der Dateiname einfache Anführungszeichen enthält, können Sie ihn entweder mit dem I\'m\ .m4aStil (NICHT mit einfachen Anführungszeichen umgeben) oder mit dem Stil 'I'\''m .m4a'OR 'I'\''m'\ '.m4a'(umgeben mit einfachen Anführungszeichen) maskieren, jedoch weder mit 'I\'m\ .m4a'noch 'I'm .m4a'.

Wenn Sie ffmpeg testen, beachten Sie, dass die Fehlermeldung inImpossible to open der ersten Zeile möglicherweise irreführend ist (die Datei ist vorhanden). Überprüfen Sie die zweite Zeile, die entweder No such file or directory(Datei nicht vorhanden) oder Invalid data found when processing input(ungültige Mediendatei) ist.

Obst
quelle
1
Das Hinzufügen einer Datei vor jedem Dateinamen hat mein Problem bei der Verwendung von Dateien aus einer Textdatei behoben.
hdoghmen