【问题标题】:FFMediaElement: How to stream from CamLink 4K?FFMediaElement:如何从 CamLink 4K 流式传输?
【发布时间】:2021-04-18 12:07:17
【问题描述】:

我想使用 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# wpf ffmpeg


    【解决方案1】:

    我没有任何“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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2011-12-24
      • 2015-06-22
      • 2016-01-21
      • 2013-01-22
      • 2019-10-04
      • 1970-01-01
      相关资源
      最近更新 更多