我正在使用ffmpeg.org,当我在命令行中运行ffmpeg -y -f vfwcap -r 25 -i 0 out.mp4
时,我可以从网络摄像头抓取视频并将其写入out.mp4
文件。但是,我无法在任何地方看到那条流。我想在c#中编写一些基于ffmpeg功能的简单包装器,到目前为止,我发现在Stack before上提到的帖子,但没有关于实时显示数据(而不是将其保存到文件中)。有没有人有这方面的经验?我可以举例说明在图片框或其他组件上从网络摄像头“绘制”收到的数据吗?
谢谢!
答案 0 :(得分:2)
您的关联帖子中的一条评论说:
如何围绕ffmpeg的本机接口编写C ++ / CLI包装器 然后从你的应用程序调用你的包装器接口?
我认为这正是你想要做的。 (请注意,FFmpeg在最新版本的Visual Studio中已经运行了多年,因此链接帖子中对此注释的响应并不适用。)
您基本上会创建一个摄像头输入(它位于libavdevice),然后您将其编码为mp4容器中的h264(请参阅output_example.c)。要获得实时显示,您将获取从vfwcap源生成的数据,对其进行解码(使用" rawvideo" libavcodec中的解码器)。这将为您提供AVFrame,其中包含数据指针,用于在应用程序的任何本机UI元素中显示图像,通常使用direct3d或opengl。阅读documentation以了解有关所有这些的更多信息。
答案 1 :(得分:1)
您可以使用MediaElement
或MediaPlayer
控件。
MediaElement是布局支持的UIElement,可以是 作为许多控件的内容消耗。它也可用于 可扩展应用程序标记语言(XAML)以及代码。 另一方面,MediaPlayer专为绘图对象而设计 缺乏布局支持。使用MediaPlayer加载的媒体只能是 使用VideoDrawing或直接与a进行交互 的DrawingContext。 MediaPlayer不能在XAML中使用。
示例XAML:
<MediaElement Source="path\to\out.mp4" Name="myMediaElement"
Width="450" Height="250" LoadedBehavior="Manual" UnloadedBehavior="Stop" Stretch="Fill"
MediaOpened="Element_MediaOpened" MediaEnded="Element_MediaEnded"/>
//
// Create a VideoDrawing.
//
MediaPlayer player = new MediaPlayer();
player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
VideoDrawing aVideoDrawing = new VideoDrawing();
aVideoDrawing.Rect = new Rect(0, 0, 100, 100);
aVideoDrawing.Player = player;
// Play the video once.
player.Play();