詳解C#如何實(shí)現(xiàn)分割視頻
文章描述
在前面兩篇寫完了對(duì)于GIF動(dòng)態(tài)圖片的分割和合成,這一篇來(lái)寫下將視頻文件分割成一幀幀圖片的方法。

開(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#設(shè)計(jì)模式編程中備忘錄模式的運(yùn)用
這篇文章主要介紹了C#設(shè)計(jì)模式編程中備忘錄模式的運(yùn)用,備忘錄模式用來(lái)保存與對(duì)象有關(guān)的數(shù)據(jù)用以在將來(lái)對(duì)對(duì)象進(jìn)行復(fù)原,需要的朋友可以參考下2016-02-02
C#調(diào)用百度翻譯API實(shí)現(xiàn)一個(gè)翻譯功能
一直喜歡用Google Translate API進(jìn)行在線翻譯,但是服務(wù)越來(lái)越慢這篇文章,所以只能換一個(gè)了,主要給大家介紹了關(guān)于C#調(diào)用百度翻譯API實(shí)現(xiàn)一個(gè)翻譯功能的相關(guān)資料,需要的朋友可以參考下2021-06-06
WPF應(yīng)用啟動(dòng)慢的問(wèn)題解決
今天碰到一個(gè)奇怪的現(xiàn)象,在某些機(jī)器上,進(jìn)行了系統(tǒng)還原后,WPF應(yīng)用打開(kāi)較慢,約有35s。本文先記錄下該問(wèn)題的解決方案,應(yīng)用啟動(dòng)性能官方文檔中有說(shuō)明,還有搜到的其它方案沒(méi)來(lái)得及測(cè)試,如NGEN update2021-05-05
asp.net新聞列表生成靜態(tài)頁(yè)之批量和單頁(yè)生成
web程序的高訪問(wèn)量、大數(shù)據(jù)量、高效的用戶體驗(yàn)度,使靜態(tài)頁(yè)技術(shù)在越來(lái)越多的網(wǎng)站上發(fā)揮作用。這篇文章主要介紹asp.net新聞列表生成靜態(tài)頁(yè)之批量和單頁(yè)生成,有需要的朋友可以參考下2015-08-08
C#實(shí)現(xiàn)Excel與DataTable的數(shù)據(jù)互轉(zhuǎn)的代碼示例
在.NET框架中,使用C#進(jìn)行Excel數(shù)據(jù)與DataTable之間的轉(zhuǎn)換是數(shù)據(jù)分析、報(bào)表生成、數(shù)據(jù)遷移等操作中的常見(jiàn)需求,這一過(guò)程涉及到將Excel文件中的數(shù)據(jù)讀取并加載至DataTable中,本文將介紹如何通過(guò)C#語(yǔ)言實(shí)現(xiàn)Excel數(shù)據(jù)與DataTable之間的高效轉(zhuǎn)換,需要的朋友可以參考下2024-11-11
詳解如何使用BenchmarkDotNet對(duì).NET代碼進(jìn)行性能基準(zhǔn)測(cè)試
BenchmarkDotNet是一個(gè)基于.NET開(kāi)源、功能全面、易于使用的性能基準(zhǔn)測(cè)試框架,這篇文章就來(lái)和小編一起學(xué)習(xí)一下如何使用BenchmarkDotNet對(duì).NET代碼進(jìn)行性能基準(zhǔn)測(cè)試吧2024-12-12
C#中嵌入SQLite數(shù)據(jù)庫(kù)的簡(jiǎn)單方法
本文給大家介紹的是C#中嵌入SQLite數(shù)據(jù)庫(kù)的簡(jiǎn)單方法,十分的方便也很實(shí)用,有需要的小伙伴可以參考下。2015-06-06

