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 в другом месте.