Файловете от живи източници в 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, а не до всеки елемент в конвейера.


person Bastiaan de Jong    schedule 26.05.2015    source източник


Отговори (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.

person thiagoss    schedule 27.05.2015
comment
Благодаря за вашият отговор! Както се оказа, трябваше да изпратя EOS събитието само до src елемента, а не до всеки елемент в конвейера. Явно това е моя грешка. Опцията -e работи добре в командния ред, както казахте. Бихме искали да използваме gstreamer 1.x, но нито едно от java свързванията, които опитахме, не работи. Или поне не за нас. Определено обаче ще го разгледаме отново в бъдеще. - person Bastiaan de Jong; 05.06.2015
comment
Не е необходимо сами да изпращате EOS до елементите, просто изпратете eos директно до обекта на конвейера и конвейерът ще разбере какво да прави със събитието. - person thiagoss; 05.06.2015