Ffmpeg не работает с именами файлов, у которых есть пробелы

Я использую FFMPEG для измерения продолжительности видео, хранящихся в ведро Amazon S3.

Я читал документы FFMPEG, и они явно указывают, что все пробельные и специальные символы должны быть экранированы, чтобы FFMPEG правильно их обрабатывал:

См. документы 2.1 и 2.1.1: https://ffmpeg.org/ffmpeg-utils.html

Однако при работе с файлами, имена файлов которых содержат пробелы, ffmpeg не может выполнить результат.

Я пробовал следующее, без успеха

ffmpeg -i "http://s3.mybucketname.com/videos/my\ video\ file.mov" 2>&1 | grep Duration | awk '{print $2}' | tr -d
ffmpeg -i "http://s3.mybucketname.com/videos/my video file.mov" 2>&1 | grep Duration | awk '{print $2}' | tr -d
ffmpeg -i "http://s3.mybucketname.com/videos/my'\' video'\' file.mov" 2>&1 | grep Duration | awk '{print $2}' | tr -d
ffmpeg -i "http://s3.mybucketname.com/videos/my\ video\ file.mov" 2>&1 | grep Duration | awk '{print $2}' | tr -d

Однако, если я удаляю пробелы в имени файла - все хорошо, и длительность видео возвращается.

Любая помощь приветствуется!

Ответ 1

Если в вашем имени файла есть пробелы, просто укажите их:

ffmpeg -i "my video file.mov"

В URL-адресе пробела не может быть. Скорее всего, вам нужно заменить каждое пространство на %20, чтобы вы получили:

ffmpeg -i http://myurl.com/my%20video%20file.mov
                             ^^^     ^^^

Ответ 2

ffmpeg использует% для определения шаблона и обработки нескольких файлов. Например, если ваше имя файла закодировано в URI, вы должны использовать "-pattern_type none", чтобы избежать неправильной интерпретации из ffmpeg:

ffmpeg -pattern_type none -i file%20name.mp4

Ответ 3

for fileOne in *.mp4
do
  baseName=$(basename "$fileOne" .mp4) # "$fileOne" quotes are necessary because of special chars in it
  echo "input: " $fileOne
  echo "var: " $baseName
  echo "target: " $baseName".mp3"
  cp "$fileOne" "tmp.mp4"
  # ffmpeg problem with specialchars like whitespaces and '-'
  # ffmpeg -i \"$fileOne\" "$baseName..mp3"
  ffmpeg -i "tmp.mp4" "tmp.mp3"
  mv "tmp.mp3" "$baseName".mp3""
done
rm "tmp-mp4"

'просто переименуйте файл для конвертации :)

Ответ 4

Чтобы ffmeg работал с именем файла/путем, в котором есть пробелы, вы должны:
1) установить рабочий каталог с помощью Pushd
2) поместите ваше имя файла в кавычку ""


Вот рабочий пример:

cls

REM ++++++++++++++++++++++++++
REM Cut an audio file by right-cliking it (works also on multiple selected audio)
REM 1) save this file
REM 2) open registry, browse to  Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SystemFileAssociations\audio\shell. On the left panel, right-click on "shell" and select "New", then "Key". Type "Cut audio 5min". Right click on the newly created folder "Cut audio 5min" and select again "New" and then "Key". Type 'command'. On the right pane, double-click the "(default)" value name and type the following:  "C:\Users\Me\Cut audio.cmd" "%1"
REM  optional: if you want an Icon : in the left pane, right click  "Cut audio 5min", and select String value, then in the right pane, rename the new value to Icon, then double click on it and past this "%SystemRoot%\\System32\\shell32.dll,186"     (; list icon: https://diymediahome.org/windows-icons-reference-list-with-details-locations-images/ )

REM 3) right click an audio file and select "Cut audio 5min": the chunks will be created in the same folder. 

REM because ffmpeg has trouble with path/filename with space, we set the working directory to the folder of the audio file and the we run the command not on a full path but just on the filename, with "" around it

REM get https://stackoverflow.com/a/15568171/3154274
REM fullpath of rightclicked file %1
REM full path (letter drive + path ithout letter drive)    %~d1%~p1
REM filename (filename + extension)   %~n1%~x1 

REM https://windowsloop.com/split-mp3-files-with-ffmpeg/
REM ffmpeg -i "input_audio_file.mp3" -f segment -segment_time 300 -c copy output_audio_file_%%03d.mp3
REM 300= 5min chunk

REM ++++++++++++++++++++++++++


REM set working directory
Pushd %~d1%~p1

REM  to let the windows open cmd /k ffmpeg -i "%~n1%~x1" -f segment -segment_time 300 -c copy "%~n1"_%%03d.mp3
cmd /k ffmpeg -i "%~n1%~x1" -f segment -segment_time 300 -c copy "%~n1"_%%03d.mp3

Ответ 5

Я решил это, "заключив" в кавычки аргумент, содержащий путь к файлу. В моем случае путь был сохранен в аргументе% 1 (который был записан в реестре в кавычках, которые экранированы:\"% 1 \"). Я получаю его (с помощью скрипта PowerShell), просто используя $ arg (встроенный аргумент). Затем я использовал его, чтобы получить некоторую информацию о файле, такую как:

# Get the File path:  
$FilePath = $args

# Get the complete file name:
$file_name_complete = [System.IO.Path]::GetFileName("$FilePath")

# Get File Name Without Extension:
$fileNameOnly = [System.IO.Path]::GetFileNameWithoutExtension("$FilePath")

# Get the Extension:
$fileExtensionOnly = [System.IO.Path]::GetExtension("$FilePath")

Не забывайте цитату вокруг $FilePath.

Затем вы можете использовать его для разделения аудиофайлов на 5 минут, просто так:

ffmpeg -i $file_name_complete -f segment -segment_time 300 -c copy $fileNameOnly"_"%03d$fileExtensionOnly #

Ответ 6

Как отмечали многие, лучший вариант - заключить строку в кавычки. Это работает для всех других специальных символов. Я прилагаю снимок из Вот несколько примеров, которые я нашел на странице документации ffmpeg. Я прилагаю снимок экрана на случай, если в будущем он будет недоступен.

Quoting Special Characters