c# - 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 文件,我不确定我缺少哪些参数/设置。
解决方案
我没有任何“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' 是用于指定输出视频编解码器的选项,与解复用器无关。
推荐阅读
- firebase - 我想在方法中对 FireStore 的值进行 CRUD
- python - Airflow DAG Task to Archive files 创建递归文件夹
- android - Android Studio:打开文件操作失败(打开文件操作未能连接到打开和保存面板服务。)
- node.js - 使用multer和nodejs将图像上传到谷歌云存储时出错
- flutter - staggeredGridView 中的列不能超过 2 列
- spring-boot - Hibernate - 如何减少准备语句所花费的时间
- python - '%' 是做什么的?
- css - 如何为 vue 签名创建掩码/过滤器?
- powershell - 配置 VSCode 以停止在 PowerShell 控制台中运行代码
- python - 如何使用 SELENIUM Python 制作一个即使 PC 离线也能保持抓取数据的 Web Scraper