Как изменить выходной файл канала без остановки

Microsoft опубликовала официальный пакет Visual Studio Code для Linux, упакованный в виде моментального пакета. Чтобы установить Visual Studio Code в дистрибутивы на основе Debian -и другие дистрибутивы, поддерживающие пакеты моментальных снимков, откройте терминал и введите:

sudo apt install snapd
sudo snap install code-insiders --classic

Snap в классическом ограничении ведет себя как традиционно упакованное приложение с полным доступом к системе, а расширения Visual Studio Code устанавливаются в домашний каталог пользователя.

Как следует из названия, Visual Studio Code — это редактор кода со встроенным терминалом,не полноценная IDE, но последняя версия Visual Studio Code — очень хороший редактор кода.

0
12.04.2021, 18:04
1 ответ

Запустите это в оболочке и пусть работает:

arecord -D dmic_sv -c2 -r 48000 -f S32_LE -t wav -V mono -v \
| while :; do dd bs=384000 count=1 iflag=fullblock 2>/dev/null >>output; done

Каждый ddбудет отправлять 1 секунду данных (48000 выборок по 4 байта (32 бита )по 2 каналам, таким образом, 384000 байтов )на output. Важно то, что outputбудет открываться для добавления отдельно для каждого dd. Это означает, что когда вы rm outputили mv output soundfile1.wav, то следующий ddбудет писать в outputзаново, т.е. будет создан новый output.

Если mv output soundfile1.wavпроисходит в пределах одной файловой системы, данные не будут потеряны. Я имею в виду, что если вы объедините soundfile1.wavи новый output, вы воссоздадите исходный поток. Это связано с тем, что переименование (или даже удаление )файла не беспокоит процесс, который уже открыл файл.

Переход на другую файловую систему фактически эквивалентен cp+ unlink. В этом случае может случиться, что ddдобавляется к outputмежду cpи unlink, и этот фрагмент теряется. Так что не перемещайте outputнапрямую в другую файловую систему. Если вам нужно это сделать, переименуйте в пределах одной файловой системы, дождитесь появления нового outputи только после этого переместите переименованный файл в другую файловую систему.

Другой подход связан с символическими ссылками. Сделать outputсимволическую ссылку на какое-нибудь имя:

ln -s soundfile2.wav output

Затем выполните команду. Целевой файл может не существовать, он будет создан. Если он существует, к нему будут добавлены данные.

Если вы хотите переключиться на другой файл, атомарно обновите символическую ссылку:

ln -sf soundfile3.wav output

Новый файл может находиться в другой файловой системе, это не имеет значения.Симлинкинг также позволяет остановить сохранение данных без остановки arecord. Просто перенаправьте нашу всегда работающую команду -на/dev/null:

ln -sf /dev/null output

Это может быть полезно, потому что, скорее всего, если вы снова измените символическую ссылку и начнете сохранять в обычный файл, вы не вызовете всплывающее окно.

Подходы без или с символическими ссылками можно использовать вместе. Когда outputявляется символической ссылкой, просто удалите ее, и следующий ddсоздаст outputкак обычный файл. Когда outputявляется обычным файлом и вы хотите заменить его символической ссылкой без потери данных, жестко свяжите файл с новым именем (, например. ln output soundfile4.wav), а затем атомарно замените outputсимволической ссылкой.

Примечания:

  • iflag=fullblockне является портативным. Если ваш ddне поддерживает его, попробуйте bs=8 count=48000. В любом случае мы не хотим, чтобы переход к новому файлу происходил в середине -семпла. Наша одна выборка составляет 8 байтов (32 бита на 2 канала ). Я недостаточно знаком с arecordи конвейерами в Linux, я могу только надеяться, что инструмент никогда не разделит сэмпл на более чем одну запись и, следовательно, dd bs=8будет считывать полные сэмплы даже без iflag=fullblock. Но я не уверен. Если ddкогда-либо читает меньше (, сравните этот ), тогда он сможет закончить запись в середине -сэмпла, и если вы перейдете на новый файл, то новый файл начнется с неполного сэмпла и не правильно играть. Так что, если вы можете использовать iflag=fullblock, используйте его. Помните,dd— капризный инструмент, которым трудно правильно пользоваться ; iflag=fullblockснижает раздражительность.
  • Вы можете изменить bsи/или count, чтобы увеличить или уменьшить степень детализации. Например. bs=38400 count=1будет запускать 10 ddпроцессов в секунду, поэтому вся установка сможет переключаться на новый файл почти мгновенно. С другой стороны, 10 процессов в секунду могут быть ненужной нагрузкой. Все, что вам подходит. Просто оставьте bsкратным 8.
  • Когда вы завершаете команду с помощью Ctrl + C , текущий ddможет выйти без записи.С помощью bs=384000 count=1вы можете потерять до 1 секунды уже захваченных данных. Во время записи важных вещей отложите Ctrl + C на секунду-две.
2
28.04.2021, 22:53

Теги

Похожие вопросы