有没有办法在c#app中使用ffmpeg?

时间:2015-05-06 07:23:03

标签: c# video ffmpeg video-streaming

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

2 个答案:

答案 0 :(得分:2)

您的关联帖子中的一条评论说:

  

如何围绕ffmpeg的本机接口编写C ++ / CLI包装器   然后从你的应用程序调用你的包装器接口?

我认为这正是你想要做的。 (请注意,FFmpeg在最新版本的Visual Studio中已经运行了多年,因此链接帖子中对此注释的响应并不适用。)

您基本上会创建一个摄像头输入(它位于libavdevice),然后您将其编码为mp4容器中的h264(请参阅output_example.c)。要获得实时显示,您将获取从vfwcap源生成的数据,对其进行解码(使用" rawvideo" libavcodec中的解码器)。这将为您提供AVFrame,其中包含数据指针,用于在应用程序的任何本机UI元素中显示图像,通常使用direct3d或opengl。阅读documentation以了解有关所有这些的更多信息。

答案 1 :(得分:1)

您可以使用MediaElementMediaPlayer控件。

  

MediaElement是布局支持的UIElement,可以是   作为许多控件的内容消耗。它也可用于   可扩展应用程序标记语言(XAML)以及代码。   另一方面,MediaPlayer专为绘图对象而设计   缺乏布局支持。使用MediaPlayer加载的媒体只能是   使用VideoDrawing或直接与a进行交互   的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