2015-05-06 39 views
0

我使用的是ffmpeg.org,当我在命令行中运行ffmpeg -y -f vfwcap -r 25 -i 0 out.mp4时,我可以从我的摄像头中抓取视频并将其写入out.mp4文件。但是,我无法在任何地方看到该流。我想在c#中编写一些基于ffmpeg功能的简单包装,到目前为止,我在Stack before上发现了帖子,但没有关于实时显示数据(而不是将其保存到文件中)的信息。有没有人有任何经验呢?我是否可以在图片框或其他组件上“画”从网络摄像头接收到的数据? 谢谢!有没有在c#应用程序中使用ffmpeg的方法?

回答

1

您可以使用MediaElementMediaPlayer控件。

MediaElement是UIElement,受布局支持,可以作为许多控件的内容消耗 。它也可用于 可扩展应用程序标记语言(XAML)以及代码。另一方面,MediaPlayer专为绘图对象设计, 缺乏布局支持。使用MediaPlayer加载的媒体只能是使用VideoDrawing呈现的 或通过直接与 DrawingContext进行交互。 MediaPlayer无法在XAML中使用。

  • 的MediaElement

样品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"/> 
  • MediaPlayer的
// 
    // 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();  

Multimedia Overview on MSDN

+0

谢谢,这是一个很好的开始,但是我想把那里的实时视图,而不是'out.mp4',你知道我怎么能改变Source标签呢? – randomuser1

+0

源是一个URI,所以' aergistal

2

一个在你的链接文章的评论中这样说:

如何围绕FFmpeg的原生界面 编写C++/CLI包装,然后调用你的包装接口从你的应用程序?

我想这正是你想要做的。 (请注意,FFmpeg在最近版本的Visual Studio中工作良好,因此对此评论的链接帖子中的响应不适用。)

您基本上会创建一个摄像头输入(它生活在libavdevice),然后你将它编码到h464的mp4容器中(见output_example.c)。要获得实时显示,您需要从vfwcap源生成数据,对其进行解码(使用libavcodec中的“rawvideo”解码器)。这给你一个AVFrame,它有数据指针在你的应用程序的任何本地UI元素中显示图像,通常使用direct3d或opengl。阅读documentation了解更多关于这一切的信息。

相关问题