综合网上前辈们的帖子和问答,自己进行修改完善。
项目要求读取文件夹中的视频文件并展现出来,点击可以播放。用ListView存放,预期效果像各大直播平台那样,现在正在实现。猜测直播平台应该也是读取当前时间点之前某个时间点的视频帧当做了视频的缩略图。
public string CatchImg(string path, string imgFile) { string flv_img = imgFile + ".jpg"; System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = "cmd.exe";//要执行的程序名称 p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true;//可能接受来自调用程序的输入信息 p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息 p.StartInfo.CreateNoWindow = true;//不显示程序窗口 p.Start();//启动程序 //向CMD窗口发送输入信息: p.StandardInput.WriteLine("ffmpeg -ss 00:00:10 -i " + path + " -f image2 -y " + flv_img); //-ss表示搜索到指定的时间 -i表示输入的文件 -y表示覆盖输出 -f表示强制使用的格式 if (System.IO.File.Exists(flv_img)) { return flv_img; } return ""; }读取并把视频帧放在ListViewItem中后删除截取的图片,因为是把图片存放在了当前程序运行文件夹中,直接调用File.Delete()删除就可以了。 foreach (FileInfo info in files) { string path = CatchImg("E:\\Movies\\" + info.Name, info.Name); //使用过后删除 File.Delete(path); } ============================2016年8月16日更新============================之前是打算用WPF做,但是看了别人的例子是用WinForm做的,WPF的ListView和WinForm的ListView好像不一样,用WinForm的ListView把模式改为
listView.View = View.LargeIcon; 就可以添加图片了,并不需要在《WPF编程宝典》上看到的那样写资源字典了。把CatchImg改了一下,不需要传入参数了,视频路径直接写到了函数里。代码如下: private ListView listView; private void myInitializeComponent() { this.WindowState = FormWindowState.Maximized; listView = new ListView(); listView.Dock = DockStyle.Fill; ImageList imageList = new ImageList(); listView.View = View.LargeIcon; imageList.ImageSize = new Size(100, 100); DirectoryInfo dir = new DirectoryInfo(@"E:\Movies"); FileInfo[] files = dir.GetFiles("*.mp4"); listView.LargeImageList = imageList; listView.BeginUpdate(); foreach (FileInfo info in files) { ListViewItem item1 = new ListViewItem(); //之前是直接用Images.FromFile(string Path)从文件夹中读取,删除时没法删除 //改从文件流中读取图片,关闭窗口时可以删除文件 FileStream fs = new FileStream(info.Name + ".jpg", FileMode.Open); Image img = Image.FromStream(fs); fs.Close(); imageList.Images.Add(info.Name, img); item1.Text = info.Name; item1.ImageKey = info.Name; listView.Items.Add(item1); } listView.MouseDoubleClick += new MouseEventHandler(videoPlay); listView.EndUpdate(); this.Controls.Add(listView); } 构造函数: public Form1() { CatchImg(); //如果不Sleep,程序主窗口就不会出现,因为CatchImg之后生成了图片,但是在调用Init之前还没有生成完 Thread.Sleep(1000); myInitializeComponent(); this.FormClosed += new FormClosedEventHandler(DeleteImage); //窗口关闭之后删除生成的jpg图片 }刚开始发现每次都需要先运行一次程序,但是窗口没有出现,Debug文件夹中生成了视频截图,再运行一次才可以。猜测是因为ffmpeg生成过程中没有生成完Init()就开始执行了,找不到图片它就不显示窗口了,所以Sleep1s就可以了。
DeleteImage函数:
private void DeleteImage(object sender, FormClosedEventArgs e) { string sourceDir = @"E:\Visual Studio\WPF&C++\aLittleTest\Demo\bin\Debug"; string[] picList = Directory.GetFiles(sourceDir, "*.jpg"); Dispose(); //释放使用的资源 MessageBox.Show("关闭窗口"); try { foreach (string f in picList) { MessageBox.Show(f); File.Delete(f); } } catch (IOException ex) { MessageBox.Show(ex.Message, "发生错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } }最后的效果如下图: