Как дальше исследовать проблемы с линковкой в ​​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

Вот где я застрял. Как я мог бы узнать, почему эти компоненты не могут связываться друг с другом? Я думаю, что, возможно, между ними в конвейере должен быть какой-то другой компонент, но я думаю, что это не так, если посмотреть на дамп успешного конвейера (третье изображение) выше.

Заранее благодарю за любую помощь.

0 ответов

Другие вопросы по тегам