Разделение wav-файлов Gstreamer multifilesink

У меня проблема с записью потоков с помощью 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


person user3921796    schedule 04.09.2014    source источник
comment
нет никакой разницы между использованием gst-launch-1.0 и gst-launch-0.10   -  person user3921796    schedule 04.09.2014
comment
привет, ты смог решить эту проблему?   -  person Sagar Pilkhwal    schedule 26.02.2016


Ответы (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
    
person mreithub    schedule 04.09.2014
comment
Я хочу иметь несжатые файлы, поэтому я не могу использовать mp3. Копирование заголовка также не является хорошей идеей, потому что тогда файлы не знают, насколько они длинные. Есть ли способ разделить один файл wav, например, на 1 мин частей с использованием gstreamer? - person user3921796; 05.09.2014

Если вы также хотите использовать некоторые сценарии и разделить задачу на разные 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.

person mreithub    schedule 06.09.2014