У меня проблема с файлами, записанными из живых источников (веб-камеры) и псевдоживых источников (скриншоты) в GStreamer. Полученные файлы не имеют временной длины и, как следствие, вообще не воспроизводятся в Media Player Classic. В Firefox они играют, но без временной длины и иногда с повышенной скоростью.
Кажется, не имеет значения, какой (псевдо) живой источник я использую, какой кодек или контейнер. История всегда одна и та же; неправильные медиафайлы без установленной продолжительности.
Однако, когда я добавляю параметр «num-buffers=100» в dx9screencapsrc, элемент src отправляет событие EOS после этого количества буферов, после чего файл корректно отображается в MPC и Firefox. Таким образом, событие EOS, кажется, что-то делает, чтобы файл закрывался должным образом.
Я пробовал обычные способы остановки конвейера (через setState(...)). Попытался вручную отправить событие EOS всем элементам, прослушивая событие EOS на шине, а затем выходя из конвейера. Все безрезультатно, файлы остаются поврежденными.
Мой вопрос в том, как я могу остановить конвейер при использовании (псевдо) живых источников и создать правильные файлы (т.е. в этом случае имеет правильную продолжительность).
Я использую gstreamer-java с GStreamer 0.10 на Java 6 и Windows 8. В качестве примера возьмем следующий конвейер:
dx9screencapsrc ! video/x-raw-rgb,framerate=15/1 ! ffmpegcolorspace ! vp8enc ! webmmux ! filesink location=%s
На данный момент я в недоумении, как решить эту проблему. Любая помощь приветствуется!
ИСПРАВЛЕНО Как оказалось, мне пришлось отправлять событие EOS только элементу src, а не каждому элементу в конвейере.