詳解C#如何實(shí)現(xiàn)分割視頻
文章描述
在前面兩篇寫(xiě)完了對(duì)于GIF動(dòng)態(tài)圖片的分割和合成,這一篇來(lái)寫(xiě)下將視頻文件分割成一幀幀圖片的方法。
開(kāi)發(fā)環(huán)境
.NET Framework版本:4.5
開(kāi)發(fā)工具
Visual Studio 2013
實(shí)現(xiàn)代碼
public static void Run(string cmd) { try { string ffmpeg = AppDomain.CurrentDomain.BaseDirectory + "ffmpeg.exe"; ProcessStartInfo startInfo = new ProcessStartInfo(ffmpeg); startInfo.UseShellExecute = false; startInfo.CreateNoWindow = true; startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.Arguments = cmd; Process process = Process.Start(startInfo); process.WaitForExit(5000); process.Kill(); } catch { } } /// <summary> /// 分割視頻 /// </summary> /// <param name="videoPath">視頻路徑</param> /// <param name="outPath">輸出圖片路徑</param> public static void Split(string videoPath, string outPath) { Run(string.Format(" -i {0} -r 10 -y -f image2 -ss 00:00:01 {1}\\%d.jpg", videoPath, outPath)); } /// <summary> /// 按時(shí)間獲取某幀圖片 /// </summary> /// <param name="videoPath">視頻路徑</param> /// <param name="outPath">輸出圖片路徑</param> /// <param name="frameTime">時(shí)間(格式:00:00:01)</param> public static void GetFrame(string videoPath, string outPath, string frameTime) { Run(string.Format("-ss 00:00:01 -i {1} {2}", frameTime, videoPath, outPath)); }
private void btn_select_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "視頻|*.mp4;*.avi"; ofd.Title = "請(qǐng)選擇視頻文件"; ofd.InitialDirectory = Application.StartupPath; if (ofd.ShowDialog() == DialogResult.OK) { axWindowsMediaPlayer1.URL = ofd.FileName; string outPath = Application.StartupPath + "\\cover.jpg"; FFmpegUtil.GetFrame(ofd.FileName, outPath, "00:00:01"); pictureBox1.Image = Image.FromFile(outPath); } } private void btn_split_Click(object sender, EventArgs e) { if(!File.Exists(axWindowsMediaPlayer1.URL)){ MessageBox.Show("未選擇視頻"); return; } FolderBrowserDialog fbd = new FolderBrowserDialog(); fbd.Description = "選擇存儲(chǔ)位置"; fbd.ShowNewFolderButton = true; if (fbd.ShowDialog() == DialogResult.OK) { string[] files = Directory.GetFiles(fbd.SelectedPath); foreach (string file in files) { File.Delete(file); } FFmpegUtil.Split(axWindowsMediaPlayer1.URL, fbd.SelectedPath); if (MessageBox.Show("視頻分割完成,是否打開(kāi)文件夾?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { Process.Start(fbd.SelectedPath); } } }
實(shí)現(xiàn)效果
代碼解析:視頻分割技術(shù)主要是利用了FFMpeg來(lái)實(shí)現(xiàn)的,C#在這里其實(shí)只是一個(gè)調(diào)用者。這個(gè)在方法Run
中可以看的出來(lái),首先是需要將FFMpeg放到debug目錄下的,然后使用Process類來(lái)調(diào)用;這里有個(gè)問(wèn)題需要注意下,就是調(diào)用后經(jīng)常會(huì)被卡住,沒(méi)辦法退出來(lái),所以使用了WaitForExit(2000)
來(lái)處理。并且在等待結(jié)束后將該進(jìn)程給Kill掉了,這個(gè)方式可能不太規(guī)范,如有更好的方法,感謝指教。
調(diào)用的話就直接輸入命令就可以了,代碼中分別使用了以下兩條命令:
- 獲取第一秒的圖片作為封面圖顯示到了圖片控件中
- 將視頻分割成一張張圖片并保存到了文件夾中
到此這篇關(guān)于詳解C#如何實(shí)現(xiàn)分割視頻的文章就介紹到這了,更多相關(guān)C#分割視頻內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C# List<T>的Contains,Exists,Any,Where性能對(duì)比
這篇文章主要介紹了詳解C# List<T>的Contains,Exists,Any,Where性能對(duì)比,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Unity Undo實(shí)現(xiàn)原理和使用方法詳解
本文將詳細(xì)介紹Unity Undo實(shí)現(xiàn)原理和使用方法,并提供多個(gè)使用例子,幫助開(kāi)發(fā)者更好地理解和應(yīng)用該功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07在web.config和app.config文件中增加自定義配置節(jié)點(diǎn)的方法
本篇文章主要是對(duì)在web.config和app.config文件中增加自定義配置節(jié)點(diǎn)的方法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01C#使用Linq to XML進(jìn)行XPath查詢的代碼實(shí)現(xiàn)
最近在用到HtmlAgliltyPack進(jìn)行結(jié)點(diǎn)查詢時(shí),發(fā)現(xiàn)這里選擇結(jié)點(diǎn)使用的是XPath,所以這里總結(jié)一下在C#中使用XPath查詢XML的方法,習(xí)慣了用Linq,這里也是用的Linq to xml的,需要的朋友可以參考下2024-08-08