Сохраните аудио и видео в один файл с помощью GStreamer с камеры и микрофона

496
Hanlon

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

В настоящее время я сейчас, как для записи видео ...

gst-launch-1.0 -e autovideosrc ! videoconvert ! matroskamux ! filesink location=recording.mkv 

и аудио ...

gst-launch-1.0 -e autoaudiosrc ! audioconvert ! wavenc ! filesink location=recording.wav 

...по отдельности.

Что мне нужно, это файл, который содержит видео recording.mkvи аудио от recording.wav.


Я нашел что-то, что может работать, если немного подправить.

gst-launch-1.0 -e autovideosrc ! queue ! videoconvert ! mkv. autoaudiosrc ! queue ! audioconvert ! mkv. matroskamux name=mkv ! filesink location=test.mkv sync=false 

Он записывает видео, но не аудио, хотя, как я уже сказал, я думаю, что для записи аудио нужно просто немного его настроить.

0
https://stackoverflow.com/questions/37416015/gstreamer-write-both-video-and-audo-streams-into-a-single-mp4-container-after-c music2myear 5 лет назад 0
@ music2myer Итак, я должен записать видео и аудио отдельно, а затем объединить их? Могу ли я не просто сохранить их одновременно в одном файле (во время записи)? Hanlon 5 лет назад 0
Я не знаю возможностей gstreamer, но ответ на вопрос, который я связал, предложил прочитать документацию по gst-launch, которая, предлагая функции concat, я полагаю, может также предлагать захват аудио и видео в реальном времени, как это было предложено Ответ вы выяснили ниже. Рад, что ты смог заставить все это работать. music2myear 5 лет назад 0

1 ответ на вопрос

1
Hanlon

Вот:

gst-launch-1.0 -e autovideosrc ! queue ! videoconvert ! mkv. autoaudiosrc ! queue ! audioconvert ! mkv. matroskamux name=mkv ! filesink location=test.mkv sync=false 

Вот как это работает:

  1. Мы получаем видео с веб-камеры, используя autovideosrc .
  2. Затем мы помещаем этот канал в его собственный поток, выводя его в queue .
  3. Видеопоток от queueидет кvideoconvert где он конвертируется (я не уверен, что этот шаг необходим).
  4. Наконец, видео поток переходит в элемент с именем mkv, который имеет тип matroskamux. Этот элемент преобразует видео канал в Matroska.
  5. После этого мы получаем аудио с помощью autoaudiosrc.
  6. Мы размещаем канал из autoaudiosrcдругой ветки, используя queue.
  7. Из queueаудио идет туда, audioconvertгде он конвертируется (также не уверен, если это необходимо).
  8. Преобразованный звук идет на тот же matroskamuxэлемент mkv. Здесь аудио канал преобразуется в Matroska.
  9. Поскольку аудио- и видеопотоки идут к одному и тому же элементу, они объединяются в один канал Matroska.
  10. Наконец, этот канал Matroska сохраняется в файл с помощью filesink. Возможно, вам придется установить, sync=falseесли ваш компьютер не зверь.

Вот и все. Кроме того, если кому-то интересно, почему я написал в вопросе, что эта команда не записывает звук, это потому, что я забыл включить микрофон.

Всем привет. Я использую вашу команду внутри python gstreammer, но она не работает, когда я подключаю аудио / видео src к конвейеру insteqad autovideosrc. Вы когда-нибудь использовали Python для этого? DGoiko 5 лет назад 0
@DGoiko Привет! Я не пробовал это с использованием Python, но я пробовал это на C, и это сработало. Hanlon 5 лет назад 0
Я подключил его к appsrc (примерно так: https://github.com/streamlink/streamlink/blob/master/examples/gst-player.py, но с использованием uridecodebin вместо playbin и некоторых пользовательских бинов, включил один, основанный на вашем конвейере для записи), и он останавливается в начале. С плеером все в порядке: если я подключаю аудио и видео тройки с очередями к autoaudiosrc + autovideosrc + flac audio audio, все работает нормально, но если я поставлю видео очередь, она сначала зависнет. Отладка 3 ничего не показывает ... Странно. DGoiko 5 лет назад 0
Не могли бы вы опубликовать код? Желательно, чтобы вы могли открыть новый вопрос, но копирование кода в Pastebin тоже подойдет. Только не забудьте дать мне ссылку здесь. Hanlon 5 лет назад 0