Файлы из живых источников в gstreamer повреждены
У меня проблема с файлами, написанными из живых источников (веб-камеры) и псевдо-живых источников (скриншоты) в 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, а не каждому элементу в конвейере.
1 ответ
Правильный способ - отправить событие EOS в конвейер и подождать, пока вы не получите его как GstMessage на шине.
Если вы говорите, что пытались это сделать, и это не сработало, это может быть ошибкой в задействованных элементах (маловероятно), в привязках Java или в вашем коде.
Чтобы исключить ошибки в задействованных элементах, я бы порекомендовал попробовать:
gst-launch-0.10 -e dx9screencapsrc ! video/x-raw-rgb,framerate=15/1 ! ffmpegcolorspace ! vp8enc ! webmmux ! filesink location=%s
Флаг -e включит eos-on-shutdown, что означает, что как только вы прервете процесс, он отправит EOS и будет ждать его на шине (как должно делать ваше приложение). Если это работает, я бы порекомендовал просмотреть ваш код.
Важно отметить, что вы используете gstreamer 0.10, который уже 3 года устарел и не поддерживается. Настоятельно рекомендуется перейти на серию 1.x.