Вопрос или проблема
Я использую Arch Linux и пытаюсь записать аудио, воспроизводимое на моем компьютере, с помощью ffmpeg
и сохранить его как файл .flac
. Я вызываю следующую команду:
ffmpeg -f pulse -i default -c:a flac -compression_level 8 "~/path/to/target/directory/myRecording.flac"
В этот момент я получаю Error opening output
. Далее указывается вышеуказанное имя целевого файла, за которым следует No such file or directory
. Я проверил, что целевая директория существует. Я пробовал использовать различные источники, идентифицированные через pactl
, но ничего не изменяет ошибку, даже если директория, в которую я хочу записать, действительно существует.
Оболочки, обычно используемые в Linux/Unix, заменяют тильду (~
) значением переменной оболочки HOME
, но только если тильда не заключена в кавычки и не экранирована.
Вся механика более сложная, с поддерживаемым синтаксисом, таким как ~username
или требованием, чтобы ~
стояла в начале слова (с возможными исключениями). Подробности могут зависеть от оболочки; для Bash смотрите соответствующую часть Bash Reference Manual.
В Linux/Unix очень немногие программы расширяют ~
или интерпретируют кавычки; это – задачи оболочки. Ваша строка "~/path/…/myRecording.flac"
стала ~/path/…/myRecording.flac
потому, что оболочка не расширила тильду в кавычках (обратите внимание, что она убрала кавычки). ffmpeg
получил ~/path/to/target/directory/myRecording.flac
как один из аргументов. Инструмент не расширяет ~
самостоятельно. Команда будет работать, если в вашей текущей рабочей директории существует буквально названная ~
директория, и если внутри этой директории ~
находится path/to/target/directory/
.
Если вы хотите, чтобы оболочка расширила ~
, то вы не должны её заключать в кавычки. Например, заключение в кавычки подобным образом приведет к тому, что оболочка расширит тильду:
… ~/"path/to/target/directory/myRecording.flac"
Ответ или решение
Почему возникает ошибка "No such file or directory" при попытке записи аудио с помощью FFmpeg?
Описание проблемы
Вы используете Arch Linux и пытаетесь записать аудио, которое воспроизводится на вашем компьютере, с помощью FFmpeg. Для этого вы используете следующую команду:
ffmpeg -f pulse -i default -c:a flac -compression_level 8 "~/path/to/target/directory/myRecording.flac"
При выполнении команды вы получаете ошибку "Error opening output", за которой следует сообщение "No such file or directory". Вы уже убедились, что целевая директория существует и испытывали различные источники, но ошибка остается неизменной.
Причина ошибки
Проблема кроется в использовании символа тильда (~
) в вашей команде. В оболочках Linux/Unix символ ~
обычно обозначает домашний каталог текущего пользователя. Однако, это работает только в том случае, если ~
используется без кавычек и иных экранирующих символов.
Детали и решение
-
Тильда в кавычках: Когда вы заключаете путь в кавычки, как в
"~/path/to/target/directory/myRecording.flac"
, оболочка не выполняет замену~
, и программа получает строку как есть, без расширения. Поэтому, FFmpeg пытается записать файл по пути~/path/to/target/directory/myRecording.flac
, воспринимая~
как имя каталога, что приводит к ошибке "No such file or directory". -
Обходной путь:
-
Не включайте тильду в кавычки, если вы хотите, чтобы оболочка выполнила её замену:
ffmpeg -f pulse -i default -c:a flac -compression_level 8 ~/path/to/target/directory/myRecording.flac
-
Или явным образом укажите полный путь вместо использования
~
:ffmpeg -f pulse -i default -c:a flac -compression_level 8 /home/username/path/to/target/directory/myRecording.flac
-
Заключение
Знание о том, как оболочка обрабатывает специальные символы, такие как тильда, может существенно упростить выполнение команд и устранение возникающих ошибок. Убедитесь, что путь указан корректно и интерпретируется системой так, как вы ожидаете. Это не только решает текущую проблему, но и предотвращает похожие проблемы в будущем. Всегда проверяйте документацию или применяйте ручную проверку путей для достижения оптимального результата.