ffmpeg concat non funziona con il percorso assoluto


14

Devo usare concat con percorso assoluto, ma non sembra funzionare. Nel documento dice che dovrebbe funzionare. Qualcuno ha idea di come farlo funzionare? ffmpeg Doc

Non funziona perché sembra aggiungere la directory del file di testo al percorso del file

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

Io uso 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

Risposte:


16

Ho appena incontrato messaggi di errore simili. Alla fine l'ho capito. C'erano due problemi.

Numero 1:

Quando si fa

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

la path_to_text_filedeve usare le barre in avanti, non backslash, anche in Windows. Tuttavia, questa regola non si applica ai percorsi dei file video sulla riga di comando, ma solo al percorso del file di testo sulla riga di comando.

Numero 2:

I percorsi elencati nel tuo file di testo sono interpretati da ffmpeg come relativi alla posizione del tuo file di testo. (In particolare, i percorsi elencati non sono relativi alla directory di lavoro corrente.)

Pertanto, ad esempio, se i file video che si stanno tentando di concatenare insieme si trovano nella stessa directory del file di testo (ma diversi dalla directory di lavoro corrente), i percorsi elencati nel file di testo dovrebbero essere semplicemente i nomi dei file video senza alcuna directory precedente.

Spero che questo aiuti qualcuno in futuro.


I percorsi elencati nel tuo file di testo sono interpretati da ffmpeg come relativi alla posizione del tuo file di testo. C'è un bug in ffmpeg sotto windows, che è evidenziato nella mia risposta
Leon,

2

È possibile sia utilizzare un file di testo che è una lista di file di input in questo modo:

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

O

Puoi nominare esplicitamente i file in questo modo:

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

Si noti che si utilizzano 2 ingressi uno dopo l'altro, quindi si usa -c:v copyper dire che non ci dovrebbe essere un nuovo solo ricodifica. Inoltre, questo è il demuxer concat . Questo è flessibile, ma richiede che i 2 file di input abbiano gli stessi codec.

Il contenuto del file di testo è come hai scritto:

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

Nota le virgolette singole

Il formato generico è:

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

Ciò si applicherebbe a più unità e percorsi.

Ecco un esempio reale di un file di concatenazione che funziona:

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'

Questo è attraverso:
Un'unità interna Un'unità
USB esterna Un'unità di
rete su un altro computer Windows sullo stesso dominio

Il comando usa è:

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

Funziona come previsto senza errori.


1
Devo usare un file poiché posso avere molti video. E ho bisogno di un percorso assoluto nel file
DarkPixel,

Non posso, il file si trova su un'unità di rete e in più cartelle. Non riesco a forzare una directory specifica
DarkPixel,

Ho questo errore con il percorso assoluto: impossibile aprire 'C: / temp / ffmpeg / c: /temp/ffmpeg/01.mov'
DarkPixel

Stai ricevendo l'errore perché il comando è errato. Vedi la risposta
Rajib,

1
Questa risposta funziona con la richiesta di ffmpeg N-90173, Win10, CMD solo se il parametro -i NON ha virgolette singole e NON utilizza barre: -i C: \ foo \ bar \ filelist.txt
Jay Borseth

2

Avviso; su Windows, se si utilizza concat con un file di testo, i percorsi nel file di testo devono essere relativi al percorso di output .

Per esempio

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

Se i tuoi file si trovano nella directory il C:\temp\bar.mp4tuo file di testo è simile al seguente:

file ..\temp\bar.mp4
...

1
"Personaggio mancante ?
DavidPostill

2

Uso

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

Nel tuo caso

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

La chiave è -safe 0 . Ciò consente di inserire percorsi assoluti nel file txt.


Sotto le finestre c'è un avvertimento che è coperto nella mia risposta: superuser.com/a/1374679/598963
Leon

2

La risposta di Eric fornisce un'importante istruzione per consentire percorsi completi nell'input del demuxer concat (è necessario fornire l' -safe 0opzione a ffmpeg). Tuttavia, in Windows, il demuxer concat di ffmpeg non gestisce correttamente i percorsi assoluti / completi a partire dal nome del disco . Sebbene riconosca correttamente i percorsi completi nei suoi controlli di sicurezza, interpreta erroneamente tali percorsi come relativi (perché non iniziano con una barra) quando apre il file. Poiché i percorsi non assoluti sono relativi alla posizione dello script di input del demuxer concat, antepone ffmpegil percorso di quest'ultimo al percorso del file. Se l'argomento della riga di comando dello script concat non contiene alcun separatore di percorso di file (ovvero è solo un nome file), il problema viene mascherato.

Illustrazione:

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!

-1

Anche se non cmd.exefa distinzione tra maiuscole e minuscole, ffmpegnon lo è (essendo costruito principalmente su Linux, tende verso le convenzioni della shell * nix). Se modifichi c:su ogni riga del tuo file di input C:, dovrebbe funzionare, penso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.