ffmpeg concat: "Nombre de archivo no seguro"

84

Intentando convertir un montón de archivos mts en un gran archivo mp4:

stephan@rechenmonster:/mnt/backupsystem/archive2/Videos/20151222/PRIVATE/AVCHD/BDMV$ ~/bin/ffmpeg-git-20160817-64bit-static/ffmpeg -v info -f concat -i <(find STREAM -name '*' -printf "file '$PWD/%p'\n") -deinterlace -r 25 -s hd720 -c:v libx264 -crf 23 -acodec copy -strict -2 ~/tmp/Videos/20151222.mp4
ffmpeg version N-81364-gf85842b-static http://johnvansickle.com/ffmpeg/  Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.1 (Debian 5.4.1-1) 20160803
  configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --enable-libmp3lame --enable-libx264 --enable-libx265 --enable-libwebp --enable-libspeex --enable-libvorbis --enable-libvpx --enable-libfreetype --enable-fontconfig --enable-libxvid --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvo-amrwbenc --enable-gray --enable-libopenjpeg --enable-libopus --enable-libass --enable-gnutls --enable-libvidstab --enable-libsoxr --enable-frei0r --enable-libfribidi --disable-indev=sndio --disable-outdev=sndio --enable-librtmp --enable-libmfx --enable-libzimg --cc=gcc-5
  libavutil      55. 28.100 / 55. 28.100
  libavcodec     57. 53.100 / 57. 53.100
  libavformat    57. 46.101 / 57. 46.101
  libavdevice    57.  0.102 / 57.  0.102
  libavfilter     6. 51.100 /  6. 51.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.100
  libpostproc    54.  0.100 / 54.  0.100
[concat @ 0x56054a0] Unsafe file name '/mnt/backupsystem/archive2/Videos/20151222/PRIVATE/AVCHD/BDMV/STREAM'
/dev/fd/63: Operation not permitted

¿Alguna idea de lo que sale mal aquí? ¿Qué significa el término "archivo inseguro" en este contexto?

sers
fuente
49
Agregar -safe 0antes -i. Ver ffmpeg.org/ffmpeg-all.html#Options-31
Gyan

Respuestas:

85

La respuesta de @Mulvya (¡gracias!) Funciona: "Agregar -safe 0antes -i". Luego apareció otro problema con el find STREAM -name '*' -printf "file '$PWD/%p'\n"que devuelve la ruta vacía como primera entrada. Cambié esto por for f in ./*.wav; do echo "file '$PWD/$f'"; done(ver https://trac.ffmpeg.org/wiki/Concatenate ) y ahora parece funcionar. ¡Viva!

sers
fuente
1
También puede cambiar el findsubcomando a find STREAM -type f -name '*' -printf "file '$PWD/%p'\n"(y no olvide agregar el -safe 0comando ffmpeg).
erik
18

Para responder por qué, necesitamos ver el funcionamiento de los demuxers de ffmpeg, que leen los flujos multimedia desde un archivo de entrada. En este caso, estamos usando "concat", con las siguientes opciones: (documentos archivados)

Este demuxer acepta la siguiente opción:

safeSi se establece en 1, rechaza las rutas de archivo no seguras. Una ruta de archivo se considera segura si no contiene una especificación de protocolo y es relativa y todos los componentes solo contienen caracteres del conjunto de caracteres portátiles (letras, dígitos, punto, guión bajo y guion) y no tienen punto al principio de un componente.

Si se establece en 0, se acepta cualquier nombre de archivo.

El valor predeterminado es 1.

-1 es equivalente a 1 si el formato se probó automáticamente y 0 en caso contrario.

Resulta que find .pone un ./delante del archivo. Consulte ¿Cómo eliminar "./" inicial en "buscar" de Unix? para encontrar soluciones si no desea utilizar -safe 0.

qwr
fuente
16

La respuesta de @sers es totalmente correcta, solo le muestro el comando para que no ponga -safe 0 en ningún otro lugar.

ffmpeg.exe -f concat -safe 0 -i "clips.txt" -c copy "video.mp4"
Manthan Patel
fuente
11

En mi caso, las comillas dobles provocan el error.

Yo uso el ffmpeg -f concat -i concat.txt -c copy output.m4acomando, que concat.txtcontiene la lista de archivos de entrada para concat.

Nombre de archivo inseguro (las comillas dobles se tratan como parte del nombre de archivo, -safe 0no se puede arreglar esto):

file "song1.m4a"
file "song2.m4a"

Nombre de archivo seguro (comillas simples):

file 'song1.m4a'
file 'song2.m4a'

Nombre de archivo seguro (sin comillas):

file song1.m4a
file song2.m4a

Las comillas simples anteriores y sin comillas solo son seguras si solo contienen "letras, dígitos, punto (excepto prefijo), guión bajo y guión" . Entonces, el siguiente nombre de archivo común no funcionará:

  • espacio
  • glifo
  • / (camino)
  • período de prefijo (archivo oculto)

Todavía necesitas -safe 0esos casos.

[Advertencia sobre citar y escapar]

Siempre necesita escapar 'en la parte del nombre del archivo . la razón es porquefile Im' .avise agregará una cotización de cierre automáticamente aIm' .avi', que es lo mismo quefile Im' .avi'. La última cita imparfile Im' .avi''''''también se convertirá en comillas de cierre agregadasfile Im' .avi''''''', por lo que no tieneNo such file or directoryerror. Me doy cuenta de este fenómeno porque el espacio ya no necesita escapar\después del prefijo con comillas simples, sin tener que agregar comillas de cierre.

A pesar de más arriba (debe escapar 'por \y no escapa con "), el estilo de escape es similar a la cáscara . Si el nombre del archivo contiene comillas simples, puede escapar con el estilo I\'m\ .m4a(NO entre comillas simples) o el estilo 'I'\''m .m4a'OR 'I'\''m'\ '.m4a'(entre comillas simples), pero ni de 'I\'m\ .m4a'ni 'I'm .m4a'.

Cuando pruebe ffmpeg, tenga en cuenta que el mensaje de errorImpossible to open de la primera línea puede ser engañoso (el archivo existe), debe verificar la segunda línea, que es No such file or directory(el archivo no existe) o Invalid data found when processing input(archivo multimedia no válido).

Fruta
fuente
1
agregar un archivo delante de cada nombre de archivo resolvió mi problema al usar archivos de un archivo de texto.
hdoghmen