none
用mediaplayer保存视频第一帧作为视频文件缩略图,结果保存下来老是全黑. RRS feed

  • 问题

  •  void MainWindow_Loaded(object sender, RoutedEventArgs e)
            {
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter = "VideoFile|*.wmv";
                if (ofd.ShowDialog() == true)
                {
                    _mediaPlayer.Open(new Uri(ofd.FileName));
                    visual = new DrawingVisual();
                    _mediaPlayer.Position = TimeSpan.FromSeconds(6);
                    _mediaPlayer.ScrubbingEnabled = true;
                    _mediaPlayer.Pause();
                    using (var dc = visual.RenderOpen())
                    {
                        dc.DrawVideo(_mediaPlayer, new Rect(0, 0, 100, 100));
                    }
                }
    
            }
    
            void _mediaPlayer_MediaOpened(object sender, EventArgs e)
            {
                var bitmap = new RenderTargetBitmap(_mediaPlayer.NaturalVideoWidth, _mediaPlayer.NaturalVideoHeight, 96, 96, PixelFormats.Pbgra32);
    
                bitmap.Render(visual);
                image.Source = bitmap;
                image.Width = _mediaPlayer.NaturalVideoWidth;
                image.Height = _mediaPlayer.NaturalVideoHeight;
            }
    


    在wpf揭秘中看到这种方法.但是截屏出来老是黑色的.网上说需要在load函数中初始化visual对象不然视频还未加在完,但是还是黑屏.

    不明白为什么在mediaopened事件中还会存在未加载完的情况吗?我查了没有其他更合理的事件了呀.

    从网上下载了个例子.(videoThumbnailer)感觉基本代码写的都一模一样了,还是黑屏.求赐教.

     

    2011年11月20日 12:25

答案

  • 你好,

    问题应该是由于保存的时候视频还没有加载好造成的。

    MediaPlayer本身就不是设计用来完成这样的工作的,这只是一个播放器,不是视频捕获。

    如果非要做的话,你在Pause之后Thread.Sleep几秒应该就可以了。

    其实为视频做缩略图的话,我建议你使用DirectShow而不是WPF。可以在网上搜索一下应该会有不少相关的资料的。


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 xyzdumpling 2011年11月24日 2:30
    2011年11月22日 7:18
    版主
  • ???

    • 已标记为答案 xyzdumpling 2011年11月24日 2:30
    • 已编辑 Shi Xin 2016年5月16日 9:46
    2011年11月22日 11:36
  • ???

    • 已标记为答案 xyzdumpling 2011年11月24日 2:26
    • 已编辑 Shi Xin 2016年5月16日 9:47
    2011年11月23日 11:12

全部回复

  • 你好,

    问题应该是由于保存的时候视频还没有加载好造成的。

    MediaPlayer本身就不是设计用来完成这样的工作的,这只是一个播放器,不是视频捕获。

    如果非要做的话,你在Pause之后Thread.Sleep几秒应该就可以了。

    其实为视频做缩略图的话,我建议你使用DirectShow而不是WPF。可以在网上搜索一下应该会有不少相关的资料的。


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 xyzdumpling 2011年11月24日 2:30
    2011年11月22日 7:18
    版主
  • ???

    • 已标记为答案 xyzdumpling 2011年11月24日 2:30
    • 已编辑 Shi Xin 2016年5月16日 9:46
    2011年11月22日 11:36
  • 额还是黑屏....
    2011年11月23日 9:47
  • ???

    • 已标记为答案 xyzdumpling 2011年11月24日 2:26
    • 已编辑 Shi Xin 2016年5月16日 9:47
    2011年11月23日 11:12
  • 实在不好意思...刚试用了很多种方法(ShellFile,encoder)但是这两种好像都在xp下有问题.不过当时encoder那个例子用的是第一秒的position,后来发现第一帧确实是黑屏.

    因为看到的那个videoThumbnailer例子刚开始的时候没有设置Position,而且还多资料都说黑屏是因为没加载完的问题...实在不好意思.

    2011年11月24日 2:30