Вот код, который я сейчас использую. В этом примере устанавливается соединение WebRTC, принимаются видеокадры и делается попытка отобразить их в VideoView:
Код: Выделить всё
public async Task Main(VideoView videoView, int cameraIndex, CancellationToken token, string cameraUrl)
{
Debug.WriteLine("Starting WebRTC connection setup.");
_libVLC = new LibVLC();
_mediaPlayer = new MediaPlayer(_libVLC);
_videoView = videoView;
// Assign MediaPlayer when _videoView is fully loaded
_videoView.Loaded += (sender, e) =>
{
_videoView.MediaPlayer = _mediaPlayer;
Debug.WriteLine("MediaPlayer set on VideoView.");
};
await StartSocket(cameraIndex, token);
await SendInitialRequest(cameraIndex, cameraUrl, token);
await InitializePeerConnection(cameraIndex, token);
_ = Task.Run(() => ReceiveWebSocketMessages(cameraIndex, token));
Debug.WriteLine("WebRTC connection setup complete.");
}
private async Task InitializePeerConnection(int cameraIndex, CancellationToken token)
{
var config = new PeerConnectionConfiguration
{
IceServers = new List
{
new IceServer
{
Urls = new List { "turn:localhost:3478" },
TurnUserName = "testuser",
TurnPassword = "testpassword"
}
}
};
pc = new PeerConnection();
await pc.InitializeAsync(config);
Debug.WriteLine("PeerConnection initialized.");
// Configure the transceiver for receiving video
var videoTransceiver = pc.AddTransceiver(MediaKind.Video);
videoTransceiver.DesiredDirection = Transceiver.Direction.ReceiveOnly;
// Event for handling the remote video track
pc.VideoTrackAdded += async (RemoteVideoTrack track) =>
{
Debug.WriteLine("Remote video track added.");
// Here, frame processing logic can be added if we want debug info.
track.I420AVideoFrameReady += frame =>
{
Debug.WriteLine($"Frame received - Width: {frame.width}, Height: {frame.height}");
};
// Play once MediaPlayer and VideoView are initialized
if (!_mediaPlayer.IsPlaying)
{
_mediaPlayer.Play();
Debug.WriteLine("MediaPlayer started.");
}
};
}
Кадры принимаются из потока WebRTC (что подтверждено журналированием), но не отображаются в VideoView.< /p>
Вопросы:
- Является ли VideoView лучшим выбором для отображения видео WebRTC в WPF или мне следует использовать другой элемент управления? , например MediaElement или WriteableBitmap?
- Существует ли более эффективный метод прямого отображения потоков WebRTC в WPF, который минимизирует задержку?
- Если VideoView подходит , как я могу гарантировать, что он правильно обновляется с входящими кадрами WebRTC?
Что я пробовал:
- Сначала я использовал VideoView из библиотеки LibVLC, чтобы визуализировать видеопоток WebRTC, как показано в приведенном выше коде. MediaPlayer установлен и воспроизводится, и я подтвердил, что кадры WebRTC принимаются в событии VideoTrackAdded. Однако сам элемент управления VideoView не обновляет и не отображает поток.
- Я также пытался вызвать _mediaPlayer.Play() в разных местах, чтобы убедиться, что он запущен, и добавил операторы отладки в убедитесь, что кадры принимаются должным образом.
Подробнее здесь: https://stackoverflow.com/questions/791 ... eam-in-wpf