ffmpeg concat: "Небезопасное имя файла"

Попытка преобразовать кучу mts-файлов в большой 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

Есть идеи, что здесь не так? Что означает термин "небезопасный файл" в этом контексте?

Спасибо Стефан

2 ответа

Решение

Ответ @Mulvya (спасибо!) Работает: "Добавить -safe 0 до -i". Затем появилась другая проблема с find STREAM -name '*' -printf "file '$PWD/%p'\n" который возвращает пустой путь в качестве первой записи. Изменил это для for f in ./*.wav; do echo "file '$PWD/$f'"; done (см. https://trac.ffmpeg.org/wiki/Concatenate) и теперь, похоже, работает. Ура!

В моем случае двойные кавычки вызывают ошибку.

я использую ffmpeg -f concat -i concat.txt -c copy output.m4a команда, которая concat.txt содержит список входных файлов для объединения.

Небезопасное имя файла (двойные кавычки рассматриваются как часть имени файла,-safe 0 не могу это исправить):

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

Имя безопасного файла (одинарные кавычки):

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

Имя безопасного файла (без кавычек):

file song1.m4a
file song2.m4a

Вышеупомянутые одинарные кавычки и без кавычек безопасны только в том случае, если они содержат только "буквы, цифры, точку (кроме префикса), подчеркивание и дефис". Таким образом, следующее общее имя файла не будет работать:

  • пространство
  • глиф
  • / (дорожка)
  • период префикса (скрытый файл)

Тебе все еще нужно -safe 0 для этого случая.

[Предостережение относительно цитирования и экранирования]

Вам всегда нужен побег 'в части имени файла. Причина в том, чтоfile Im' .avi автоматически добавит заключительную цитату Im' .avi', что совпадает с file Im' .avi'. Последняя нечетная цитата вfile Im' .avi'''''' также будут добавлены закрывающие кавычки file Im' .avi''''''', поэтому у него нет No such file or directoryошибка. Я понимаю это явление, потому что больше не нужно убегать\ после префикса с одинарной кавычкой, без необходимости добавлять закрывающую кавычку.

Несмотря на вышеизложенное (необходимо убежать ' по \ и не сбежать с "), escape-стиль аналогичен shell. Если имя файла содержит одинарные кавычки, вы можете либо экранировать его с помощьюI\'m\ .m4a(НЕ заключен в одинарные кавычки) стиль, или 'I'\''m .m4a' ИЛИ 'I'\''m'\ '.m4a'(в одинарных кавычках), но ни один из 'I\'m\ .m4a' ни 'I'm .m4a'.

Когда вы тестируете ffmpeg, обратите внимание на сообщение об ошибке первой строкиImpossible to openможет вводить в заблуждение (файл действительно существует), вам нужно проверить вторую строку, которая является одним изNo such file or directory(файл не существует) или Invalid data found when processing input(неверный медиафайл).

Чтобы ответить, почему, с https://ffmpeg.org/ffmpeg-all.html:

Этот демультиплексор допускает следующие параметры:

safeЕсли установлено значение 1, отклонять небезопасные пути к файлам. Путь к файлу считается безопасным, если он не содержит спецификации протокола и является относительным, а все компоненты содержат только символы из переносимого набора символов (буквы, цифры, точку, подчеркивание и дефис) и не имеют точки в начале компонента.

Если установлено значение 0, принимается любое имя файла.

По умолчанию 1.

-1 эквивалентно 1, если формат был автоматически проверен, и 0 в противном случае.

Оказывается find . ставит ./перед файлом. См. Как убрать начало "./" в unix "find"? для решений, если вы не хотите использовать-safe 0.

Об ответе совершенно правильно, я просто покажу вам команду, чтобы вы не ставили -safe 0 в другом месте.

Вот решение

Другие вопросы по тегам