ffmpeg concat no funciona con ruta absoluta

14

Necesito usar concat con ruta absoluta, pero no parece funcionar. En el documento dice que debería funcionar. ¿Alguien tiene una idea de cómo hacer que funcione? ffmpeg Doc

No funciona porque parece agregar el directorio del archivo de texto a la ruta del archivo

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

Yo 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
DarkPixel
fuente

Respuestas:

16

Acabo de encontrarme con mensajes de error similares. Finalmente lo descubrí. Hubo dos problemas.

Problema 1:

Al hacer

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

la path_to_text_filedebe utilizar barras diagonales, no barras invertidas, incluso en Windows. Sin embargo, esta regla no parece aplicarse a las rutas del archivo de video en la línea de comando, solo para la ruta del archivo de texto en la línea de comando.

Problema 2:

Las rutas enumeradas dentro de su archivo de texto son interpretadas por ffmpeg como relativas a la ubicación de su archivo de texto. (En particular, las rutas enumeradas no son relativas al directorio de trabajo actual).

Así, por ejemplo, si los archivos de video que está tratando de concatenar están en el mismo directorio que su archivo de texto (pero diferente al directorio de trabajo actual), entonces las rutas que figuran en su archivo de texto deberían ser simplemente los nombres de los archivos de video sin ningún directorio anterior.

Espero que esto ayude a alguien en el futuro.

morsa
fuente
Las rutas enumeradas dentro de su archivo de texto son interpretadas por ffmpeg como relativas a la ubicación de su archivo de texto. Hay un error en ffmpeg debajo de Windows, que se destaca en mi respuesta
Leon
2

Puede o bien utilizar un archivo de texto que es una lista de los archivos de entrada, así:

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

O

Puede nombrar explícitamente los archivos de esta manera:

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

Tenga en cuenta que usa 2 entradas una tras otra, y luego usa -c:v copypara decir que no debe haber una nueva codificación, solo uniones. Además, este es el demuxer concat . Esto es flexible, pero requiere que los 2 archivos de entrada tengan los mismos códecs.

El contenido del archivo de texto es como lo escribió:

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

Tenga en cuenta las comillas simples

El formato genérico es:

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

Eso se aplicaría a múltiples unidades y rutas.

Aquí hay un ejemplo real de un archivo de concatenación 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'

Esto es a través de:
Una unidad interna Una unidad
USB externa
Una unidad de red en otra máquina de Windows en el mismo dominio

El uso del comando es:

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

Esto funciona como se esperaba sin ningún error.

Rajib
fuente
1
Necesito usar un archivo ya que puedo tener muchos videos. Y necesito una ruta absoluta en el archivo
DarkPixel
No puedo, el archivo está en una unidad de red y en varias carpetas. No puedo forzar un directorio específico
DarkPixel
Tengo este error con la ruta absoluta: Imposible abrir 'C: / temp / ffmpeg / c: /temp/ffmpeg/01.mov'
DarkPixel
Está recibiendo el error porque su comando es incorrecto. Ver la respuesta
Rajib
1
Esta respuesta funciona en ffmpeg versión N-90173, Win10, solicitud CMD solo si el parámetro -i NO tiene comillas simples y NO usa barras diagonales: -i C: \ foo \ bar \ filelist.txt
Jay Borseth
2

Aviso; en Windows, si está utilizando concat con un archivo de texto, las rutas en el archivo de texto deben ser relativas a la ruta de salida .

P.ej

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

Si sus archivos se encuentran en el directorio, su archivo de texto se C:\temp\bar.mp4verá así:

file ..\temp\bar.mp4
...
Patricio
fuente
1
¿Falta el "personaje?
DavidPostill
2

Utilizar

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

En tu 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 clave es -safe 0 . Eso le permite poner rutas absolutas en el archivo txt.

Eric
fuente
Debajo de Windows hay una advertencia que está cubierta en mi respuesta: superuser.com/a/1374679/598963
Leon
2

La respuesta de @ Eric proporciona una instrucción importante para permitir rutas completas en la entrada del demuxer concat (debe proporcionar la -safe 0opción de ffmpeg). Sin embargo, en Windows, el demuxer concat de ffmpeg no maneja correctamente las rutas absolutas / completas que comienzan con el nombre del disco . Aunque reconoce correctamente las rutas completas en sus comprobaciones de seguridad, malinterpreta tales rutas como relativas (porque no comienzan con una barra inclinada) al abrir el archivo. Dado que las rutas no absolutas son relativas a la ubicación del script de entrada de demuxer concat, ffmpegantepone la ruta de este último a la ruta del archivo. Si el argumento de la línea de comandos del script concat no contiene ningún separador de ruta de archivo (es decir, es solo un nombre de archivo), el problema está enmascarado.

Ilustración:

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!
León
fuente
-1

Si bien cmd.exeno distingue entre mayúsculas y minúsculas, ffmpegno lo es (se construye principalmente en Linux, tiende hacia las convenciones de shell * nix). Si cambia el c:en cada línea de su archivo de entrada a C:, creo que debería funcionar.

maldad
fuente