Я сделал минимальный тестовый пример, который демонстрирует использование пользовательского видео рендерера с классической медиа-сессией.
Я использую big_buck_bunny_720p_50mb.mp4 и не вижу проблем с использованием формата RGB32.
Пример кода здесь: https://github.com/mofo7777/Stackoverflow под MinimalSinkRenderer.
EDIT
Ваша программа хорошо работает с big_buck_bunny_720p_50mb.mp4. Я думаю, что ваш файл mp4 является проблемой. Поделись, если сможешь.
Я только что внес несколько изменений:
Вы останавливаетесь на MESessionEnded и закрываетесь на MESessionStopped.
case MediaEventType.MESessionEnded:
Debug.WriteLine("MediaSession:SesssionEndedEvent");
hr = mediaSession.Stop();
break;
case MediaEventType.MESessionClosed:
Debug.WriteLine("MediaSession:SessionClosedEvent");
receiveSessionEvent = false;
break;
case MediaEventType.MESessionStopped:
Debug.WriteLine("MediaSession:SesssionStoppedEvent");
hr = mediaSession.Close();
break;
default:
Debug.WriteLine("MediaSession:Event: " + eventType);
break;
Добавление этого для ожидания звука и проверки сэмпла в порядке:
internal HResult ProcessSample(IMFSample s)
{
//Debug.WriteLine("Received sample!");
CurrentFrame++;
if (s != null)
{
long llSampleTime = 0;
HResult hr = s.GetSampleTime(out llSampleTime);
if (hr == HResult.S_OK && ((CurrentFrame % 50) == 0))
{
TimeSpan ts = TimeSpan.FromMilliseconds(llSampleTime / (10000000 / 1000));
Debug.WriteLine("Frame {0} : {1}", CurrentFrame.ToString(), ts.ToString());
}
// Do not call SafeRelease here, it is done by the caller, it is a parameter
//SafeRelease(s);
}
System.Threading.Thread.Sleep(26);
return HResult.S_OK;
}
В
public HResult SetPresentationClock(IMFPresentationClock pPresentationClock)
добавление
SafeRelease(PresentationClock);
до
if (pPresentationClock != null)
PresentationClock = pPresentationClock;