У меня проблема с записью потоков с помощью gstreamer. Приходится записывать аудио и видео отдельно и врубать по приходу сигнала. У меня правильно работает видео, но все еще есть проблемы с файлами wav. Даже простой пайплайн в gst-launch работает некорректно. У меня есть wave-файл, и я пытаюсь разбить его с помощью multifilesink: gst-launch filesrc location=test.wav ! multifilesink location=test2%d.wav next-file=4 max-file-size=512000
Но окончательные wav-файлы повреждены, в то время как тот же конвейер с ts-файлами работает нормально:gst-launch-1.0 filesrc location=test.ts ! multifilesink location=test2%d.ts next-file=4 max-file-size=2000000
Разделение wav-файлов Gstreamer multifilesink
Ответы (2)
multifilesink
ничего не знает о разделяемых им данных, поэтому он не будет заботиться о добавлении заголовков в каждый из записываемых файлов.
Причина, по которой ваши файлы .ts
работают, заключается в том, что они были разработаны как формат потоковой передачи, в котором каждый отдельный пакет будет обрабатываться независимо. Таким образом, можно просто «настроиться» на поток, когда захочется. Декодер будет просто искать следующий найденный заголовок пакета и начинать декодирование с него (подробности см. в MPEG TS). ' вики-страница.
Однако формат файла WAV
был разработан как чистый файловый (а не потоковый) формат. Поэтому в начале файла есть только один заголовок. Когда вы разделяете этот файл на несколько файлов, эти заголовки отсутствуют (тогда файл содержит только необработанные данные PCM).
Чтобы решить эту проблему, вы можете...
- вручную скопируйте заголовок
.wav
из первого файла во все остальные - используйте программы, которые поддерживают файлы PCM, и либо работайте с ними напрямую, либо конвертируйте файлы (однако вам придется вручную установить количество каналов, частоту дискретизации и битрейт при открытии этих файлов).
используйте другой, ориентированный на поток формат файла, такой как
.mp3
, который относится к тому же семейству кодеков, что и .ts, а также использует отдельный 4-байтовый заголовок для каждого кадра (помните, что MP3 — это формат файла с потерями).
пример конвейера:gst-launch filesrc location=test.wav ! wavparse ! lame ! multifilesink location=test%d.mp3 next-file=4 max-file-size=100000
Если вы также хотите использовать некоторые сценарии и разделить задачу на разные gst-launch
вызовы, я могу предложить вам другой возможный способ решить вашу небольшую проблему:
Следующий сценарий представляет собой сценарий bash для Linux. Вы должны быть в состоянии перевести это в пакетный скрипт Windows (или приложение C или Python, если хотите):
#!/bin/bash -e
# First write the buffer stream to .buff files (annotated using GStreamer's GDP format)
gst-launch -e filesrc location=test.wav ! wavparse ! gdppay ! multifilesink next-file=4 max-file-size=1000000 location=foo%05d.buff
# use the following instead for any other source (e.g. internet radio streams)
#gst-launch -e uridecodebin uri=http://url.to/stream ! gdppay ! multifilesink next-file=4 max-file-size=1000000 location=foo%05d.buff
# After we're done, convert each of the resulting files to proper .wav files with headers
for file in *.buff; do
tgtFile="$(echo "$file"|sed 's/.buff$/.wav/')"
gst-launch-0.10 filesrc "location=$file" ! gdpdepay ! wavenc ! filesink "location=$tgtFile"
done
# Uncomment the following line to remove the .buff files here, but to avoid accidentally
# deleting stuff we haven't properly converted if something went wrong, I'm not gonna do that now.
#rm *.buff
Теперь о том, что делает скрипт:
- Сначала мы собираемся использовать
multifilesink
для создания набора.buff
файлов, каждый размером менее 1 МБ (gdppay
будет аннотировать каждый буфер своими заглавными буквами; флаг-e
дляgst-launch
заставит его запустить EOS, если процесс будет завершен преждевременно, что является полезно, если вы читаете и декодируете интернет-поток) - Второй вызов
gst-launch
в циклеfor
берет один из файлов.buff
, анализирует заголовки GDP с помощьюgdpdepay
(и удаляет их), добавляет заголовок WAV и записывает результат в файл.wav
.
Надеюсь, это решение, с которым вы сможете жить, потому что я сомневаюсь, что есть способ сделать это с помощью одного единственного запуска gst-launch
.