Как дальше исследовать проблемы с линковкой в gstreamer?
Прежде всего, вы должны знать, что этот вопрос называется так, потому что это было то, что я застрял после того, как сузил свою проблему на некоторое время. Поскольку, вероятно, есть более подходящие подходы к моей проблеме, я также объясняю ниже свою проблему и то, что я делал, чтобы попытаться решить ее. Предложения по другим подходам будут очень приветствоваться.
Эта проблема
Я использую порт gstreamer для Android для рендеринга видео с удаленных камер по протоколу RTSP (UDP является транспортным методом).
С помощью playbin
все работало довольно хорошо, пока они больше не работали для подмножества этих камер.
К сожалению, у меня нет доступа к самим камерам, так как они принадлежат клиенту нашей компании, но первое, что мне пришло в голову, это то, что с ними возникнут проблемы.
Затем есть еще одно приложение для Android, которое мы используем в качестве эталона, которое по-прежнему может нормально воспроизводить видео с этих камер, поэтому сейчас я пытаюсь сделать все возможное для дальнейшего изучения проблемы с моей стороны (наше приложение для Android).
Проблема была довольно детерминированной: некоторые камеры всегда выходят из строя, другие всегда работают. Когда они терпят неудачу, иногда это было бы с reason not-linked
как причина.
Мне удалось вывести график конвейера, связанный с каждой из этих камер, когда приложение пытается воспроизвести видео с них. Тогда я мог бы заметить, что для каждой из неисправных камер соответствующие конвейеры всегда что-то упускают. Некоторые упускают только элемент приемника, другие пропускают и источник, и приемник:
Дамп трубопровода только с источником:
Отвал трубопровода без источника или раковины:
Дамп конвейера с обоими (это те случаи, когда мы действительно можем играть):
Это отвалы трубопроводов, построенных playbin
,
Попытка решения
Я пытался проверить, что произойдет, если я построю конвейер вручную с нуля (чтобы он был таким же, как при сборке с помощью playbin на третьем изображении выше), и заставил видео всех камер обрабатываться этим конвейером. Так как все камеры работали, я предполагаю, что сейчас для некоторых камер как-то не получается согласование, так что плейбин не строит конвейер для этих камер должным образом, но если я соберу его сам, в конечном итоге все будет работать так, как ожидалось (я при условии, что rtspsrc
в комбинации с glimagesink
также был выбран конвейер для воспроизведения видео с этих камер).
Вот как я пытаюсь построить этот конвейер самостоятельно:
priv->pipeline = gst_pipeline_new("rtspstreamer");
source = gst_element_factory_make("rtspsrc", NULL);
if (!source) {
GST_DEBUG("Source could not be created");
}
sink = gst_element_factory_make("glimagesink", NULL);
if (!sink) {
GST_DEBUG("Sink could not be created");
}
if (!gst_bin_add(GST_BIN(priv->pipeline), source)) {
GST_DEBUG("Could not add source to pipeline");
}
if (!gst_bin_add(GST_BIN(priv->pipeline), sink)) {
GST_DEBUG("Could not add sink to pipeline");
}
if (!gst_element_link(source, sink)) {
GST_DEBUG("Source and sink could not be linked");
}
g_object_set(source, "location", uri, NULL);
Итак, запустив приведенный выше код, я получаю следующую ошибку:
Source and sink could not be linked
Вот где я застрял. Как я мог бы узнать, почему эти компоненты не могут связываться друг с другом? Я думаю, что, возможно, между ними в конвейере должен быть какой-то другой компонент, но я думаю, что это не так, если посмотреть на дамп успешного конвейера (третье изображение) выше.
Заранее благодарю за любую помощь.