ffmpeg concat não funciona com caminho absoluto

14

Eu preciso usar concat com caminho absoluto, mas parece não funcionar. No documento, ele diz que deve funcionar. Alguém tem uma idéia de como fazê-lo funcionar? ffmpeg Doc

Não funciona porque parece anexar o diretório do arquivo de texto ao caminho do arquivo

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

Eu uso o 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
fonte

Respostas:

16

Acabei de receber mensagens de erro semelhantes. Eu finalmente descobri. Houve dois problemas.

Problema 1:

Ao fazer

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

o path_to_text_filedeve usar barras, não barras invertidas, mesmo no Windows. Essa regra parece não se aplicar aos caminhos do arquivo de vídeo na linha de comando - apenas para o caminho do arquivo de texto na linha de comando.

Edição 2:

Os caminhos listados no seu arquivo de texto são interpretados pelo ffmpeg como sendo relativos à localização do seu arquivo de texto. (Em particular, os caminhos listados não são relativos ao diretório de trabalho atual.)

Assim, por exemplo, se os arquivos de vídeo que você está tentando concatenar juntos estão no mesmo diretório que o arquivo de texto (mas diferente do diretório de trabalho atual), os caminhos listados no arquivo de texto devem ser simplesmente os nomes dos arquivos de vídeo sem nenhum diretório anterior.

Espero que isso ajude alguém no futuro.

morsa
fonte
Os caminhos listados no seu arquivo de texto são interpretados pelo ffmpeg como sendo relativos à localização do seu arquivo de texto. Há um bug no ffmpeg sob janelas, que é destaque na minha resposta
Leon
2

Você pode tanto usar um arquivo de texto que é uma lista de arquivos de entrada assim:

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

OU

Você pode nomear explicitamente os arquivos da seguinte forma:

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

Observe que você usa 2 entradas uma após a outra e depois -c:v copydiz que não deve haver junção somente de recodificação. Além disso, este é o desmembrador de concat . Isso é flexível, mas requer que os 2 arquivos de entrada tenham os mesmos codecs.

O conteúdo do arquivo de texto é como você escreveu:

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

Observe as aspas simples

O formato genérico é:

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

Isso se aplicaria a várias unidades e caminhos.

Aqui está um exemplo real de um arquivo de concatenação que funciona:

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'

É o seguinte:
Uma unidade interna Uma unidade
USB externa
Uma unidade de rede em outra máquina Windows no mesmo domínio

O comando use é:

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

Isso funciona como esperado, sem erros.

Rajib
fonte
1
Preciso usar um arquivo, pois posso ter muito vídeo. E eu preciso de caminho absoluto no arquivo
Darkpixel
Não posso, o arquivo está em uma unidade de rede e em várias pastas. Eu não posso forçar um diretório específico
Darkpixel
I tem esse erro com caminho absoluto: impossível abrir 'C: / temp / ffmpeg / c: /temp/ffmpeg/01.mov'
Darkpixel
Você está recebendo o erro porque o comando está errado. Veja a resposta.
Rajib 17/02
1
Esta resposta funciona no prompt ffmpeg versão N-90173, Win10, CMD apenas se o parâmetro -i NÃO tiver aspas simples e NÃO usar barras: -i C: \ foo \ bar \ filelist.txt
Jay Borseth
2

Aviso prévio; no Windows, se você estiver usando concat com um arquivo de texto, os caminhos no arquivo de texto precisam ser relativos ao caminho de saída .

Por exemplo

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

Se seus arquivos estão localizados no diretório, C:\temp\bar.mp4seu arquivo de texto se parece com isso:

file ..\temp\bar.mp4
...
Patrick
fonte
1
Falta "personagem?
DavidPostill
2

Usar

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

No seu 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

A chave é -safe 0 . Isso permite que você coloque caminhos absolutos no arquivo txt.

Eric
fonte
Sob o Windows, há uma ressalva que é abordada na minha resposta: superuser.com/a/1374679/598963 #
Leon Leon
2

A resposta do @ Eric fornece uma instrução importante para permitir caminhos completos na entrada do concat desmuxer (você deve fornecer a -safe 0opção para ffmpeg). No entanto, no Windows, o descomplexador de concat do ffmpeg não manipula corretamente caminhos absolutos / completos começando com o nome do disco . Embora reconheça corretamente caminhos completos em suas verificações de segurança, ele interpreta mal esses caminhos como relativos (porque eles não começam com uma barra) ao abrir o arquivo. Como os caminhos não absolutos são relativos ao local do script de entrada do concat desmuxer, ffmpegprecede o caminho deste último ao caminho do arquivo. Se o argumento da linha de comando do script concat não contiver nenhum separador de caminho de arquivo (ou seja, é apenas um nome de arquivo), o problema será mascarado.

Ilustração:

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
fonte
-1

Embora não faça cmd.exedistinção entre maiúsculas e minúsculas, ffmpegnão é (sendo construído principalmente no Linux, ele tende a convenções * nix shell). Se você alterar o c:em cada linha do seu arquivo de entrada para C:, deve funcionar, eu acho.

evilsoup
fonte