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

Попытка преобразовать кучу mts файлов в большой mp4 файл:

[email protected]:/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

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

Ответы

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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

file song1.m4a
file song2.m4a

Обратите внимание, что одинарные кавычки и без кавычек работают только при отсутствии пробела ('/' хорошо), вам все еще нужен -safe 0, если имя файла/путь содержит пробел.