ffmpeg concat funktioniert nicht mit absolutem Pfad

14

Ich muss concat mit absolutem Pfad verwenden, aber es scheint nicht zu funktionieren. In der Dokumentation heißt es, dass es funktionieren sollte. Hat jemand eine Idee, wie es funktioniert? ffmpeg Doc

Es funktioniert nicht, weil es das Textdateiverzeichnis an den Dateipfad anzuhängen scheint

Impossible to open 'C:/temp/ffmpeg/c:/temp/ffmpeg/01.mov'

Ich benutze Windows 7.

ffmpegTest.txt:
file 'c:/temp/ffmpeg/01.mov'
file 'c:/temp/ffmpeg/02.mov'

"Y:/Shotgun/bin/ffmpeg/bin/ffmpeg.exe" -f concat -i "C:/temp/ffmpeg/ffmpegTest.txt" -c copy "C:/temp/ffmpeg/test.mov
ffmpeg version N-58949-g0e575c2 Copyright (c) 2000-2013 the FFmpeg developers
  built on Dec  9 2013 22:06:49 with gcc 4.8.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libcaca --enable-libfreetype --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
  libavutil      52. 58.100 / 52. 58.100
  libavcodec     55. 45.100 / 55. 45.100
  libavformat    55. 22.100 / 55. 22.100
  libavdevice    55.  5.102 / 55.  5.102
  libavfilter     3. 92.100 /  3. 92.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
[concat @ 0000000000337920] Impossible to open 'C:/temp/ffmpeg/c:/temp/ffmpeg/01.mov'
C:/temp/ffmpeg/ffmpegTest.txt: Invalid argument
DarkPixel
quelle

Antworten:

16

Ich bin gerade auf ähnliche Fehlermeldungen gestoßen. Ich habe es schließlich herausgefunden. Es gab zwei Probleme.

Fehler 1:

Wenn Sie das tun

ffmpeg -f concat -i <path_to_text_file> ...

Sie path_to_text_filemüssen auch unter Windows Schrägstriche und keine Schrägstriche verwenden. Diese Regel scheint jedoch nicht für die Videodateipfade in der Befehlszeile zu gelten - nur für den Textdateipfad in der Befehlszeile.

Ausgabe 2:

Die in Ihrer Textdatei aufgelisteten Pfade werden von ffmpeg als relativ zum Speicherort Ihrer Textdatei interpretiert. (Insbesondere beziehen sich die aufgelisteten Pfade nicht auf das aktuelle Arbeitsverzeichnis.)

Wenn sich beispielsweise die Videodateien, die Sie miteinander verketten möchten, im selben Verzeichnis wie Ihre Textdatei befinden (sich jedoch vom aktuellen Arbeitsverzeichnis unterscheiden), sollten die in Ihrer Textdatei aufgeführten Pfade einfach die Namen der Videodateien sein ohne vorhergehende Verzeichnisse.

Hoffe das hilft jemandem in der Zukunft.

Walross
quelle
Die in Ihrer Textdatei aufgelisteten Pfade werden von ffmpeg als relativ zum Speicherort Ihrer Textdatei interpretiert. Es gibt einen Fehler in ffmpeg unter Windows, der in meiner Antwort hervorgehoben wird
Leon
2

Sie können entweder eine Textdatei verwenden, die eine Liste von Eingabedateien enthält, wie folgt:

ffmpeg -f concat -i ffmpegTest.txt -c:v copy output.mov

ODER

Sie können die Dateien explizit wie folgt benennen:

ffmpeg.exe -f concat -i 'c:/temp/ffmpeg/01.mov' -i 'c:/temp/ffmpeg/02.mov' -c:v copy 'C:/temp/ffmpeg/output.mov'    

Beachten Sie, dass Sie 2 Eingänge nacheinander verwenden und dann verwenden, um -c:v copyzu sagen, dass keine Neukodierung erfolgen soll - nur das Verknüpfen. Dies ist auch der Concat Demuxer . Dies ist flexibel, erfordert jedoch, dass die beiden Eingabedateien dieselben Codecs haben.

Der Inhalt der Textdatei ist wie Sie geschrieben haben:

file 'c:/temp/ffmpeg/01.mov'
file 'c:/temp/ffmpeg/02.mov'

Beachten Sie die einfachen Anführungszeichen

Das generische Format ist:

file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'

Dies würde für mehrere Laufwerke und Pfade gelten.

Hier ist ein echtes Beispiel für eine Verkettungsdatei, die funktioniert:

file '/run/media/rnx/New Volume1/PREMIER_OUTPUTEST/Sequence004.mpeg'
file '/home/rnx/Sequence003.mpeg'
file '/run/user/rnx/gvfs/users on edtmchn/Public/Sequence01.mpeg'

Dies gilt für:
Ein internes Laufwerk
Ein externes USB-Laufwerk
Ein Netzwerklaufwerk auf einem anderen Windows-Computer in derselben Domäne

Der Befehl verwendet wird:

ffmpeg -f concat -i conc.txt -c:v copy -strict -2 output.mpeg

Dies funktioniert wie erwartet ohne Fehler.

Rajib
quelle
1
Ich muss eine Datei verwenden, da ich viel Video haben kann. Und ich brauche absoluten Pfad in der Datei
DarkPixel
Ich kann nicht, die Datei befindet sich auf einem Netzlaufwerk und in mehreren Ordnern. Ich kann kein bestimmtes Verzeichnis
erzwingen
Ich habe diesen Fehler mit absolutem Pfad: 'C: / temp / ffmpeg / c: /temp/ffmpeg/01.mov'
DarkPixel
Sie erhalten den Fehler, weil Ihr Befehl falsch ist. Siehe die Antwort.
Rajib
1
Diese Antwort funktioniert in der Eingabeaufforderung ffmpeg Version N-90173, Win10, CMD nur, wenn der Parameter -i KEINE einfachen Anführungszeichen enthält und KEINE Schrägstriche verwendet: -i C: \ foo \ bar \ filelist.txt
Jay Borseth
2

Beachten; Wenn Sie unter Windows Concat mit einer Textdatei verwenden, müssen die Pfade in der Textdatei relativ zum Ausgabepfad sein .

Z.B

ffmpeg -f concat -i file.txt "C:\foo\file.mp4"

Wenn sich Ihre Dateien im Verzeichnis C:\temp\bar.mp4befinden, sieht Ihre Textdatei folgendermaßen aus:

file ..\temp\bar.mp4
...
Patrick
quelle
1
Fehlender "Charakter?
DavidPostill
2

Benutzen

ffmpeg.exe" -f concat -safe 0 -i fileWithAbsoluePaths.txt -c copy out.mov

In Ihrem Fall

"Y:/Shotgun/bin/ffmpeg/bin/ffmpeg.exe" -f concat -safe 0 -i "C:/temp/ffmpeg/ffmpegTest.txt" -c copy "C:/temp/ffmpeg/test.mov

Der Schlüssel ist -safe 0 . Auf diese Weise können Sie absolute Pfade in die txt-Datei einfügen.

Eric
quelle
Unter Fenstern gibt es eine Einschränkung, die in meiner Antwort behandelt wird: superuser.com/a/1374679/598963
Leon
2

Die Antwort von @ Eric enthält eine wichtige Anweisung, um vollständige Pfade im Concat-Demuxer-Eingang zuzulassen (Sie müssen die -safe 0Option für ffmpeg bereitstellen ). Unter Windows verarbeitet der concat-Demuxer von ffmpeg jedoch absolute / vollständige Pfade, die mit dem Datenträgernamen beginnen, nicht korrekt . Obwohl es bei seinen Sicherheitsüberprüfungen vollständige Pfade korrekt erkennt, interpretiert es solche Pfade beim Öffnen der Datei falsch als relativ (da sie nicht mit einem Schrägstrich beginnen). Da sich nicht absolute Pfade relativ zum Speicherort des Concat-Demuxer-Eingabeskripts befinden, ffmpegwird dessen Pfad dem Dateipfad vorangestellt . Wenn das Befehlszeilenargument des concat-Skripts keine Dateipfadtrennzeichen enthält (dh nur ein Dateiname ist), wird das Problem maskiert.

Illustration:

concat.txt:
file 'c:/videos/01.flv'
file 'c:/videos/02.flv'


ffmpeg -f concat -safe 0 -i "C:/temp/concat.txt" -c copy "C:/temp/test.flv"
...
[concat @ 0000000000abcdef] Impossible to open 'C:/temp/c:/videos/01.flv'
C:/temp/concat.txt: Invalid argument


cd C:\temp
ffmpeg -f concat -safe 0 -i "./concat.txt" -c copy "C:/temp/test.flv"
...
[concat @ 0000000000abcdef] Impossible to open './c:/videos/01.flv'
./concat.txt: Invalid argument


ffmpeg -f concat -safe 0 -i "concat.txt" -c copy "C:/temp/test.flv"
# Works successfully!
Leon
quelle
-1

Es cmd.exewird zwar nicht zwischen Groß- und Kleinschreibung unterschieden, ffmpegaber nicht (hauptsächlich unter Linux erstellt, tendiert es zu * nix-Shell-Konventionen). Wenn Sie das c:in jeder Zeile Ihrer Eingabedatei in ändern C:, sollte es funktionieren, denke ich.

Übelsuppe
quelle