Я прошел через множество страниц и форумов stackoverflow, пытаясь найти нужный мне ответ. Я создал виртуальный микрофон и пытаюсь передать ему некоторые звуки WAV, созданные с помощью FFMPEG.
Когда я хочу передать шум клавиатуры, я передаю звук на свое виртуальное устройство захвата звука следующим образом:
ffmpeg -fflags +discardcorrupt -i <Keyboard sound Path> -f s16le -ar 44100 -ac 1 - > /tmp/gapFakeMic
И когда я хочу передать какой-то синтезированный голосовой звук с помощью Espeak на свой виртуальный микрофон, я делаю следующее:
espeak -vbrazil-mbrola-4 <some random text> --stdout | ffmpeg -fflags +discardcorrupt -i pipe:0 -f s16le -ar 44100 -ac 1 - > /tmp/gapFakeMic
Проблема в том, что мое устройство захвата не записывает звук, как обычный рекордер, который все еще записывает, даже если на него не передается звук. Итак, я пытаюсь добавить тишину к wav, который создается во время работы моего приложения. Всегда, когда я пытаюсь отправить тишину в буфер, FFMPEG возвращает следующий ответ:
[NULL @ 0x5579f7921a00] Unable to find a suitable output format for 'pipe:'
FFMPEG - мощный инструмент, но его документация не может быть полезной для таких новичков, как я. Итак, я был бы признателен, если бы кто-нибудь мог ответить на это или, по крайней мере, дать мне какое-либо направление или какой-либо ресурс, где я мог бы найти способ достичь этого.
Вот как я создаю тишину для своего виртуального микрофона:
ffmpeg -f lavfi -i anullsrc=channel_layout=mono:sample_rate=44100 -t <Time in seconds> - > /tmp/gapFakeMic
Вот полный журнал:
ffmpeg version 4.1.6-1~deb10u1 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 8 (Debian 8.3.0-6)
configuration: --prefix=/usr --extra-version='1~deb10u1' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
libpostproc 55. 3.100 / 55. 3.100
Input #0, lavfi, from 'anullsrc=channel_layout=mono:sample_rate=44100':
Duration: N/A, start: 0.000000, bitrate: 352 kb/s
Stream #0:0: Audio: pcm_u8, 44100 Hz, mono, u8, 352 kb/s
[NULL @ 0x560516626f40] Unable to find a suitable output format for 'pipe:'
pipe:: Invalid argument
После того, как Gyan предоставил решение в комментариях, указанная выше ошибка больше не отображается, но мой результат аудио не работает и выходит не так, как ожидалось. Теперь команда, которая генерирует и добавляет беззвучный звук, выглядит так:
ffmpeg -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 -t <Time in seconds> -f s16le - > /tmp/gapFakeMic
Я внес некоторые изменения в команду, которую использую для передачи тишины на виртуальный микрофон. Я думаю труба ломается из-за какой-то несовместимости аудиоформатов. Надеюсь, я найду решение в ближайшие несколько дней. После каждого небольшого изменения я замечаю некоторые улучшения. Теперь я могу слышать тишину между звуками клавиш, но он записывает не все аудио, которые я ему передаю. Вот как теперь выглядит команда:
ffmpeg -f lavfi -i anullsrc=channel_layout=mono:sample_rate=44100 -t <Time in seconds> -f s16le -ar 44100 -ac 1 - > /home/icaroerasmo/gapFakeMic`
Я также понял, что когда я передаю звук в файл канала, созданный в моей домашней папке, качество звука улучшается.
После всей этой борьбы теперь ясно, что именованный канал ломается при втором вызове. Я уже искал в Google, как очистить именованный канал, но не нашел ничего, что работало.
Я отредактировал, чтобы добавить способ отправки беззвучного звука на свой виртуальный микрофон, а также добавил полный журнал
Вам необходимо установить формат вывода по конвейеру, например. -f s16le
Благодарю за ваш ответ. Это мне очень помогло. Но это все еще не 100%. Я добавил другое издание
Поделитесь полным журналом.