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

開發(fā)環(huán)境
.NET Framework版本:4.5
開發(fā)工具
Visual Studio 2013
實現(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>
/// 按時間獲取某幀圖片
/// </summary>
/// <param name="videoPath">視頻路徑</param>
/// <param name="outPath">輸出圖片路徑</param>
/// <param name="frameTime">時間(格式: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 = "請選擇視頻文件";
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 = "選擇存儲位置";
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("視頻分割完成,是否打開文件夾?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
Process.Start(fbd.SelectedPath);
}
}
}實現(xiàn)效果

代碼解析:視頻分割技術主要是利用了FFMpeg來實現(xiàn)的,C#在這里其實只是一個調用者。這個在方法Run中可以看的出來,首先是需要將FFMpeg放到debug目錄下的,然后使用Process類來調用;這里有個問題需要注意下,就是調用后經(jīng)常會被卡住,沒辦法退出來,所以使用了WaitForExit(2000)來處理。并且在等待結束后將該進程給Kill掉了,這個方式可能不太規(guī)范,如有更好的方法,感謝指教。
調用的話就直接輸入命令就可以了,代碼中分別使用了以下兩條命令:
- 獲取第一秒的圖片作為封面圖顯示到了圖片控件中
- 將視頻分割成一張張圖片并保存到了文件夾中
到此這篇關于詳解C#如何實現(xiàn)分割視頻的文章就介紹到這了,更多相關C#分割視頻內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#實現(xiàn)Excel與DataTable的數(shù)據(jù)互轉的代碼示例
在.NET框架中,使用C#進行Excel數(shù)據(jù)與DataTable之間的轉換是數(shù)據(jù)分析、報表生成、數(shù)據(jù)遷移等操作中的常見需求,這一過程涉及到將Excel文件中的數(shù)據(jù)讀取并加載至DataTable中,本文將介紹如何通過C#語言實現(xiàn)Excel數(shù)據(jù)與DataTable之間的高效轉換,需要的朋友可以參考下2024-11-11
詳解如何使用BenchmarkDotNet對.NET代碼進行性能基準測試
BenchmarkDotNet是一個基于.NET開源、功能全面、易于使用的性能基準測試框架,這篇文章就來和小編一起學習一下如何使用BenchmarkDotNet對.NET代碼進行性能基準測試吧2024-12-12

