首页 > 解决方案 > FFMediaElement:如何从 CamLink 4K 流式传输?

问题描述

我想使用 Unosquare 的 FFME 库 (v4.2.330) 显示来自 Cam Link 4K hdmi 采集卡的实时流。但是,使用以下代码,即使媒体已成功打开且没有异常,媒体元素仍保持黑色被提出。

    <ffme:MediaElement     x:Name="media" 
                           Background="Black"
                           MediaEnded="media_MediaEnded"
                           MediaOpened="media_MediaOpened"
                           MediaFailed="media_MediaFailed"
                           MediaInitializing="media_MediaInitializing"
                           LoadedBehavior="Play"
                           UnloadedBehavior="Manual"
                           />


    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        this.media.Open(new Uri("device://dshow/?video=Cam Link 4K"));
    }

    private void media_MediaInitializing(object sender, Unosquare.FFME.Common.MediaInitializingEventArgs e)
    {
        e.Configuration.PrivateOptions["framerate"] = "50";
        e.Configuration.PrivateOptions["video_size"] = "1920x1080";
        e.Configuration.PrivateOptions["vcodec"] = "rawvideo"; //also tried mjpeg
        e.Configuration.PrivateOptions["pixel_format"] = "yuyv422"; //also tried yuv420p
    }
    
    private void media_MediaFailed(object sender, Unosquare.FFME.Common.MediaFailedEventArgs e)
    {
        log.Error(e.ErrorException);
    }

使用 VLC 播放器一切正常,所以我想这与MediaInitializing. 为了获得正确的参数,我运行了ffmpeg -f dshow -i video="Cam Link 4K"哪些输出

Input #0, dshow, from 'video=Cam Link 4K':
  Duration: N/A, bitrate: N/A
    Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1920x1080, 50 fps, 50 tbr, 10000k tbn, 10000k tbc

通过运行ffmpeg -f dshow -pix_fmt yuv420p -i video="Cam Link 4K" -framerate 50 -vcodec mjpeg test.mkv,我可以将所有内容记录到文件中。

在启动期间,我正在设置Unosquare.FFME.Library.FFmpegDirectory = @"C:\ffmpeg";ffmpeg 4.2.1 (win64) 的预构建二进制文件和共享库。我还确保我的项目是针对 x64 的。由于MediaElement适用于常规 mp4 文件,我不确定我缺少哪些参数/设置。

标签: c#wpfffmpeg

解决方案


我没有任何“Unosquare 的 FFME 库”的经验,但根据我对 ffmpeg 的理解,正确的代码应该是

private void media_MediaInitializing(object sender, Unosquare.FFME.Common.MediaInitializingEventArgs e)
{
    e.Configuration.ForcedInputFormat = "rawvideo";
    e.Configuration.PrivateOptions["framerate"] = "50";
    e.Configuration.PrivateOptions["video_size"] = "1920x1080";
    e.Configuration.PrivateOptions["pixel_format"] = "yuyv422";
}

ContainerConfiguration.ForcedInputFormat应该是将输入格式指定为“-f”选项的正确选项。
ContainerConfiguration.PrivateOptions用于指定解复用器选项,'vcodec' 是用于指定输出视频编解码器的选项,与解复用器无关。

请检查https://ffmpeg.org/ffmpeg-all.html#rawvideo-1


推荐阅读