Инициализация исходного фильтра RTSP - PullRequest
1 голос
/ 20 октября 2011

У меня есть собственное решение RTSP Source Filter, которое все еще находится в стадии разработки, но в настоящее время работает с видеопотоками H.264 / MPEG-4.Моя проблема на этапе инициализации.Если я открою graphedit и добавлю один за другим фильтры источника, декодера и видео рендера RTSP и подключу их контакты, все работает нормально (URL RTSP Source в настоящий момент жестко задан).Но если я пытаюсь сохранить график и заново открыть график из сохраненного файла, график вылетает.Я думаю, что причина кроется в части инициализации моего RTSP Source Filter.Поскольку мой фильтр ничего не знает о потоках в начале, он передает недопустимые параметры декодеру.Итак, мои вопросы:

  • Как я должен точно обрабатывать процесс инициализации?
  • Когда (какая функция в коде) я должен точно подключиться к источнику и начать передачу?Конструктор класса фильтра?Выходной контактный класс конструктор?OnThreadCreate?
  • Нужно ли нам получать некоторую информацию, такую ​​как ширина / высота видео, из потоков или нам просто нужно передавать потоки в декодер?Как правильно это сделать?(Я думаю, что некоторые видео рендереры используют информацию о ширине / высоте из структуры VIDEOINFOHEADER.)
  • Как нам определить размер нашего буфера?В методе GetMediaType я устанавливаю размер выборки из заголовка растровой информации следующим образом:

    pMediaType-> SetSampleSize (pvi-> bmiHeader.biSizeImage);

Как следуетЯ устанавливаю параметры как biWidth, biHeight, biSize, biSizeImage и т. Д.?Я считаю, что мне нужно установить их с некоторыми значениями по умолчанию в начале, а затем изменить их после получения потоков, но как?

Все вопросы указывают на одну и ту же проблему.Что именно я должен делать в процессе инициализации моего RTSP Source Filter?

! UPDATE!

Я просто заметил, что когда я загружаю сохраненный график, отсоединяю и повторно соединяю контакты между декодероми видео рендерер решает проблему.Я пробовал это с различными видео рендерерами (Microsoft и некоторые другие пользовательские видео рендереры).Все они реагируют одинаково.Некоторые из них не вылетают, а воспроизводят видео с неправильным соотношением сторон.Очевидно, что то, что приводит к сбою графика или вызывает странные результаты, это не мой исходный фильтр, а некоторая недопустимая информация, передаваемая видео рендереру.Поскольку такая ситуация не возникает с другими фильтрами источников RTSP, я все еще верю, что я делаю что-то не так, чего-то не хватает.

Что может вызвать эту проблему?Нужно ли отправлять некоторую информацию о мультимедиа, когда график запускается?

PS: график падает только при запуске графика.Просто загрузка графика не вызывает сбой.

Ответы [ 3 ]

3 голосов
/ 20 октября 2011

Я согласен с Wimmel, я не считал это проблемой, если фильтр не поддерживает загрузку из сохраненного графика.Также, как сказал Роман, есть две проблемы: сбой, который необходимо отладить, и вопросы реализации.

В ответ на некоторые ваши вопросы:

  • Как мне точно обрабатывать процесс инициализации?

    Один из подходов заключается в реализации интерфейса IFileSourceFilter .Этот метод вызывается как GraphEdit, Windows Media Player сразу после загрузки фильтра, и позволяет вам выполнить RTSP DESCRIBE, чтобы получить описание сеанса мультимедиа.Для типов мультимедиа, для которых требуется текущий поток, вы также можете просмотреть поток, извлечь параметры мультимедиа, такие как ширина и высота, а затем правильно настроить график.H264 полагается на информацию в наборах параметров последовательности и изображения, которые в SDP обычно .Метод IFileSourceFilter :: Load будет вызываться платформой DS перед GetMediaType, что означает, что ваш декодер должен получить правильные параметры.

  • Нужно ли нам получатьнекоторая информация, такая как ширина / высота видео из потоков или нам просто нужно передать потоки в декодер?Как правильно это сделать?(Я думаю, что некоторые видео рендереры используют информацию о ширине / высоте из структуры VIDEOINFOHEADER.) Как мы должны определить размер нашего буфера?В методе GetMediaType я устанавливаю размер выборки из заголовка растровой информации следующим образом: *

    Зависит от декодера: некоторые декодеры просто требуют потоковой передачи мультимедиа, а затем все настраивают правильно, другие могут требовать, чтобы ширина ивысота и т. д. будет правильно настроена.Если вы используете подход, описанный выше, это не должно иметь значения.

Вы можете скачать наш исходный фильтр RTSP с открытым исходным кодом на sourceforge .Это не коммерческий фильтр источников RTSP, он обрабатывает несколько (в основном аудио) типов мультимедиа, но он показывает различные аспекты, которые могут помочь вам написать свой собственный.IIRC Я начал добавлять к нему поддержку H.264, и базовые тесты с использованием RTSP-сервера live555 были в порядке, но у меня были некоторые проблемы с отметкой времени потока H.264, хотя ...

Кроме того, я рекомендую использовать GraphStudio с целью тестирования исходного фильтра RTSP: если вы реализуете интерфейс IFileSourceFilter, он позволяет вам вводить URL-адреса.Это очень похоже на GraphEdit, но лично я предпочитаю это.

3 голосов
/ 20 октября 2011

Если у вас происходит сбой, у вас должно быть исключение (например, нарушение прав доступа) и стек вызовов во время проблемы.Это где вы отлаживаете это.Возможно, вы обнаружите, что все остальное совершенно не связано и вызвано такой простой вещью, как неинициализированная переменная.

2 голосов
/ 20 октября 2011

Я думаю, что это не большая проблема, если ваш фильтр не полностью поддерживает перезагрузку из сохраненного графика.Но это не должно произойти сбой.

Сначала я бы предложил поиск места, где он падает.Если для этого трудно использовать отладчик, просто добавьте операторы трассировки, используя OutputDebugString, и используйте DebugView , чтобы увидеть, что выполняется последним перед сбоем.Например,

HRESULT SetSampleSize(...)
{
    OutputDebugString("SetSampleSize start\n");

    //your code

    OutputDebugString("SetSampleSize exit\n");
}

Если вы видите SetSampleSize start в трассе, но не на выходе, вы знаете, что внутри этой функции происходит сбой.

Если вы не можете обработать функцию, потому что не знаете все параметры, просто верните E_FAIL.Я могу представить, что вы не можете подключить контакты, если вы не знаете, какой поток вы получаете.Если вы не подключите контакты, фильтр будет загружен без подключения в графит.Это лучше, чем подключение в неправильном формате.

...