concat ffmpeg nie działa ze ścieżką bezwzględną

14

Muszę użyć konkat z absolutną ścieżką, ale wydaje się, że to nie działa. W dokumencie mówi, że powinno działać. Czy ktoś ma pomysł, jak to zrobić? ffmpeg Doc

Nie działa, ponieważ wydaje się, że dołącza katalog plików tekstowych do ścieżki pliku

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

Używam 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
źródło

Odpowiedzi:

16

Właśnie natrafiłem na podobne komunikaty o błędach. W końcu to rozgryzłem. Były dwa problemy.

Problem 1:

Kiedy robisz

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

path_to_text_filemusi użyć ukośniki, a nie backslashy, nawet w systemie Windows. Wydaje się jednak, że ta reguła nie ma zastosowania do ścieżek plików wideo w linii poleceń - tylko do ścieżki pliku tekstowego w linii poleceń.

Problem 2:

Ścieżki wymienione w pliku tekstowym są interpretowane przez ffmpeg jako względne względem położenia pliku tekstowego. (W szczególności wymienione ścieżki nie są względne w stosunku do bieżącego katalogu roboczego.)

Dlatego na przykład, jeśli pliki wideo, które próbujesz połączyć, znajdują się w tym samym katalogu co plik tekstowy (ale inny niż bieżący katalog roboczy), wówczas ścieżki wymienione w pliku tekstowym powinny po prostu być nazwami plików wideo bez poprzednich katalogów.

Mam nadzieję, że to pomoże komuś w przyszłości.

mors
źródło
Ścieżki wymienione w pliku tekstowym są interpretowane przez ffmpeg jako względne względem położenia pliku tekstowego. W ffmpeg pod oknami jest błąd, który jest podkreślony w mojej odpowiedzi
Leon,
2

Można też użyć pliku tekstowego, który jest lista plików wejściowych tak:

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

LUB

Możesz jawnie nazwać pliki tak:

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

Zauważ, że używasz 2 wejść jeden po drugim, a następnie użyj, -c:v copyaby powiedzieć, że nie powinno być łączenia tylko z ponownym kodowaniem. Jest to również demuxer konkat . Jest to elastyczne, ale wymaga, aby 2 pliki wejściowe miały te same kodeki.

Zawartość pliku tekstowego jest taka, jak napisałeś:

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

Zwróć uwagę na pojedyncze cytaty

Ogólny format to:

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

Dotyczy to wielu dysków i ścieżek.

Oto prawdziwy przykład działającego pliku konkatenacji:

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'

Dotyczy to:
jednego dysku wewnętrznego,
jednego zewnętrznego dysku USB,
jednego dysku sieciowego na innym komputerze z systemem Windows w tej samej domenie

Komenda używa:

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

Działa zgodnie z oczekiwaniami bez żadnych błędów.

Rajib
źródło
1
Potrzebuję użyć pliku, ponieważ mogę mieć dużo filmów. Potrzebuję bezwzględnej ścieżki do pliku
DarkPixel,
Nie mogę, plik znajduje się na dysku sieciowym i w wielu folderach. Nie mogę wymusić określonego katalogu
DarkPixel
Mam ten błąd z bezwzględną ścieżką: Niemożliwe jest otwarcie „C: / temp / ffmpeg / c: /temp/ffmpeg/01.mov”
DarkPixel
Występuje błąd, ponieważ polecenie jest nieprawidłowe. Zobacz odpowiedź.
Rajib
1
Ta odpowiedź działa na monitach ffmpeg w wersji N-90173, Win10, CMD tylko wtedy, gdy parametr -i NIE zawiera pojedynczych cudzysłowów i NIE używa ukośników: -i C: \ foo \ bar \ filelist.txt
Jay Borseth
2

Ogłoszenie; w systemie Windows, jeśli używasz konkatii z plikiem tekstowym, ścieżki w pliku tekstowym muszą być względne względem ścieżki wyjściowej .

Na przykład

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

Jeśli twoje pliki znajdują się w katalogu, twój plik C:\temp\bar.mp4tekstowy wygląda następująco:

file ..\temp\bar.mp4
...
Patrick
źródło
1
Brakuje "postaci?
DavidPostill
2

Posługiwać się

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

W Twoim przypadku

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

Kluczem jest -bezpieczne 0 . To pozwala ci na umieszczenie absolutnych ścieżek w pliku txt.

Eric
źródło
Pod oknami znajduje się zastrzeżenie, które jest objęte moją odpowiedzią: superuser.com/a/1374679/598963
Leon,
2

@ Odpowiedź Erica zawiera ważną instrukcję pozwalającą na pełne ścieżki w danych demuxera konkatacji (musisz podać -safe 0opcję ffmpeg). Jednak w systemie Windows demuxer konkatacji ffmpeg nie obsługuje poprawnie ścieżek bezwzględnych / pełnych, zaczynając od nazwy dysku . Chociaż poprawnie rozpoznaje pełne ścieżki w swoich kontrolach bezpieczeństwa, błędnie interpretuje takie ścieżki jako względne (ponieważ nie zaczynają się od ukośnika) podczas otwierania pliku. Ponieważ ścieżki bezwzględne są względne w stosunku do położenia skryptu wejściowego demuxera ffmpegkonkatacji , poprzedza ścieżkę do ścieżki pliku. Jeśli argument wiersza poleceń skryptu concat nie zawiera żadnych separatorów ścieżek plików (tzn. Jest tylko nazwą pliku), problem jest maskowany.

Ilustracja:

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
źródło
-1

Chociaż cmd.exenie rozróżnia wielkości liter, ffmpegnie jest (zbudowany głównie na Linuksie, zmierza w kierunku konwencji powłoki * nix). Myślę, że jeśli zmienisz c:w każdej linii pliku wejściowego C:, powinien on działać.

zła
źródło