C#調(diào)用mmpeg進(jìn)行各種視頻轉(zhuǎn)換的類實(shí)例
本文實(shí)例講述了C#調(diào)用mmpeg進(jìn)行各種視頻轉(zhuǎn)換的類。分享給大家供大家參考。具體如下:
這個(gè)C#類封裝了視頻轉(zhuǎn)換所需的各種方法,基本上是圍繞著如何通過(guò)mmpeg工具來(lái)進(jìn)行視頻轉(zhuǎn)換
using System.Web;
using System.Configuration;
namespace DotNet.Utilities
{
//if (this.fload.HasFile)
//{
// string upFileName = HttpContext.Current.Server.MapPath("~/savefile") + "\\" + this.fload.PostedFile.FileName;
// string saveName = DateTime.Now.ToString("yyyyMMddHHmmssffff");
// string playFile = Server.MapPath(VideoConvert.savefile + saveName);
// string imgFile = Server.MapPath(VideoConvert.savefile + saveName);
// VideoConvert pm = new VideoConvert();
// string m_strExtension = VideoConvert.GetExtension(this.fload.PostedFile.FileName).ToLower();
// if (m_strExtension == "flv")
// {
// System.IO.File.Copy(upFileName, playFile + ".flv");
// pm.CatchImg(upFileName, imgFile);
// }
// string Extension = pm.CheckExtension(m_strExtension);
// if (Extension == "ffmpeg")
// {
// pm.ChangeFilePhy(upFileName, playFile, imgFile);
// }
// else if (Extension == "mencoder")
// {
// pm.MChangeFilePhy(upFileName, playFile, imgFile);
// }
//}
public class VideoConvert : System.Web.UI.Page
{
public VideoConvert()
{ }
string[] strArrMencoder = new string[] { "wmv", "rmvb", "rm" };
string[] strArrFfmpeg = new string[] { "asf", "avi", "mpg", "3gp", "mov" };
#region 配置
public static string ffmpegtool = ConfigurationManager.AppSettings["ffmpeg"];
public static string mencodertool = ConfigurationManager.AppSettings["mencoder"];
public static string savefile = ConfigurationManager.AppSettings["savefile"] + "/";
public static string sizeOfImg = ConfigurationManager.AppSettings["CatchFlvImgSize"];
public static string widthOfFile = ConfigurationManager.AppSettings["widthSize"];
public static string heightOfFile = ConfigurationManager.AppSettings["heightSize"];
#endregion
#region 獲取文件的名字
/// <summary>
/// 獲取文件的名字
/// </summary>
public static string GetFileName(string fileName)
{
int i = fileName.LastIndexOf("\\") + 1;
string Name = fileName.Substring(i);
return Name;
}
#endregion
#region 獲取文件擴(kuò)展名
/// <summary>
/// 獲取文件擴(kuò)展名
/// </summary>
public static string GetExtension(string fileName)
{
int i = fileName.LastIndexOf(".") + 1;
string Name = fileName.Substring(i);
return Name;
}
#endregion
#region 獲取文件類型
/// <summary>
/// 獲取文件類型
/// </summary>
public string CheckExtension(string extension)
{
string m_strReturn = "";
foreach (string var in this.strArrFfmpeg)
{
if (var == extension)
{
m_strReturn = "ffmpeg"; break;
}
}
if (m_strReturn == "")
{
foreach (string var in strArrMencoder)
{
if (var == extension)
{
m_strReturn = "mencoder"; break;
}
}
}
return m_strReturn;
}
#endregion
#region 視頻格式轉(zhuǎn)為Flv
/// <summary>
/// 視頻格式轉(zhuǎn)為Flv
/// </summary>
/// <param name="vFileName">原視頻文件地址</param>
/// <param name="ExportName">生成后的Flv文件地址</param>
public bool ConvertFlv(string vFileName, string ExportName)
{
if ((!System.IO.File.Exists(ffmpegtool)) || (!System.IO.File.Exists(HttpContext.Current.Server.MapPath(vFileName))))
{
return false;
}
vFileName = HttpContext.Current.Server.MapPath(vFileName);
ExportName = HttpContext.Current.Server.MapPath(ExportName);
string Command = " -i \"" + vFileName + "\" -y -ab 32 -ar 22050 -b 800000 -s 480*360 \"" + ExportName + "\""; //Flv格式
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = ffmpegtool;
p.StartInfo.Arguments = Command;
p.StartInfo.WorkingDirectory = HttpContext.Current.Server.MapPath("~/tools/");
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = false;
p.Start();
p.BeginErrorReadLine();
p.WaitForExit();
p.Close();
p.Dispose();
return true;
}
#endregion
#region 生成Flv視頻的縮略圖
/// <summary>
/// 生成Flv視頻的縮略圖
/// </summary>
/// <param name="vFileName">視頻文件地址</param>
public string CatchImg(string vFileName)
{
if ((!System.IO.File.Exists(ffmpegtool)) || (!System.IO.File.Exists(HttpContext.Current.Server.MapPath(vFileName)))) return "";
try
{
string flv_img_p = vFileName.Substring(0, vFileName.Length - 4) + ".jpg";
string Command = " -i " + HttpContext.Current.Server.MapPath(vFileName) + " -y -f image2 -t 0.1 -s " + sizeOfImg + " " + HttpContext.Current.Server.MapPath(flv_img_p);
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = ffmpegtool;
p.StartInfo.Arguments = Command;
p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
try
{
p.Start();
}
catch
{
return "";
}
finally
{
p.Close();
p.Dispose();
}
System.Threading.Thread.Sleep(4000);
//注意:圖片截取成功后,數(shù)據(jù)由內(nèi)存緩存寫到磁盤需要時(shí)間較長(zhǎng),大概在3,4秒甚至更長(zhǎng);
if (System.IO.File.Exists(HttpContext.Current.Server.MapPath(flv_img_p)))
{
return flv_img_p;
}
return "";
}
catch
{
return "";
}
}
#endregion
#region 運(yùn)行FFMpeg的視頻解碼(絕對(duì)路徑)
/// <summary>
/// 轉(zhuǎn)換文件并保存在指定文件夾下
/// </summary>
/// <param name="fileName">上傳視頻文件的路徑(原文件)</param>
/// <param name="playFile">轉(zhuǎn)換后的文件的路徑(網(wǎng)絡(luò)播放文件)</param>
/// <param name="imgFile">從視頻文件中抓取的圖片路徑</param>
/// <returns>成功:返回圖片虛擬地址;失敗:返回空字符串</returns>
public string ChangeFilePhy(string fileName, string playFile, string imgFile)
{
string ffmpeg = Server.MapPath(VideoConvert.ffmpegtool);
if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(fileName)))
{
return "";
}
string flv_file = System.IO.Path.ChangeExtension(playFile, ".flv");
string FlvImgSize = VideoConvert.sizeOfImg;
System.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
FilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
FilestartInfo.Arguments = " -i " + fileName + " -ab 56 -ar 22050 -b 500 -r 15 -s " + widthOfFile + "x" + heightOfFile + " " + flv_file;
try
{
System.Diagnostics.Process.Start(FilestartInfo);//轉(zhuǎn)換
CatchImg(fileName, imgFile); //截圖
}
catch
{
return "";
}
return "";
}
public string CatchImg(string fileName, string imgFile)
{
string ffmpeg = Server.MapPath(VideoConvert.ffmpegtool);
string flv_img = imgFile + ".jpg";
string FlvImgSize = VideoConvert.sizeOfImg;
System.Diagnostics.ProcessStartInfo ImgstartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
ImgstartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
ImgstartInfo.Arguments = " -i " + fileName + " -y -f image2 -ss 2 -vframes 1 -s " + FlvImgSize + " " + flv_img;
try
{
System.Diagnostics.Process.Start(ImgstartInfo);
}
catch
{
return "";
}
if (System.IO.File.Exists(flv_img))
{
return flv_img;
}
return "";
}
#endregion
#region 運(yùn)行FFMpeg的視頻解碼(相對(duì)路徑)
/// <summary>
/// 轉(zhuǎn)換文件并保存在指定文件夾下
/// </summary>
/// <param name="fileName">上傳視頻文件的路徑(原文件)</param>
/// <param name="playFile">轉(zhuǎn)換后的文件的路徑(網(wǎng)絡(luò)播放文件)</param>
/// <param name="imgFile">從視頻文件中抓取的圖片路徑</param>
/// <returns>成功:返回圖片虛擬地址;失敗:返回空字符串</returns>
public string ChangeFileVir(string fileName, string playFile, string imgFile)
{
string ffmpeg = Server.MapPath(VideoConvert.ffmpegtool);
if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(fileName)))
{
return "";
}
string flv_img = System.IO.Path.ChangeExtension(Server.MapPath(imgFile), ".jpg");
string flv_file = System.IO.Path.ChangeExtension(Server.MapPath(playFile), ".flv");
string FlvImgSize = VideoConvert.sizeOfImg;
System.Diagnostics.ProcessStartInfo ImgstartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
ImgstartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
ImgstartInfo.Arguments = " -i " + fileName + " -y -f image2 -t 0.001 -s " + FlvImgSize + " " + flv_img;
System.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
FilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
FilestartInfo.Arguments = " -i " + fileName + " -ab 56 -ar 22050 -b 500 -r 15 -s " + widthOfFile + "x" + heightOfFile + " " + flv_file;
try
{
System.Diagnostics.Process.Start(FilestartInfo);
System.Diagnostics.Process.Start(ImgstartInfo);
}
catch
{
return "";
}
///注意:圖片截取成功后,數(shù)據(jù)由內(nèi)存緩存寫到磁盤需要時(shí)間較長(zhǎng),大概在3,4秒甚至更長(zhǎng);
///這兒需要延時(shí)后再檢測(cè),我服務(wù)器延時(shí)8秒,即如果超過(guò)8秒圖片仍不存在,認(rèn)為截圖失敗;
if (System.IO.File.Exists(flv_img))
{
return flv_img;
}
return "";
}
#endregion
#region 運(yùn)行mencoder的視頻解碼器轉(zhuǎn)換(絕對(duì)路徑)
/// <summary>
/// 運(yùn)行mencoder的視頻解碼器轉(zhuǎn)換
/// </summary>
public string MChangeFilePhy(string vFileName, string playFile, string imgFile)
{
string tool = Server.MapPath(VideoConvert.mencodertool);
if ((!System.IO.File.Exists(tool)) || (!System.IO.File.Exists(vFileName)))
{
return "";
}
string flv_file = System.IO.Path.ChangeExtension(playFile, ".flv");
string FlvImgSize = VideoConvert.sizeOfImg;
System.Diagnostics.ProcessStartInfo FilestartInfo = new System.Diagnostics.ProcessStartInfo(tool);
FilestartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
FilestartInfo.Arguments = " " + vFileName + " -o " + flv_file + " -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=200:mbd=2:mv0:trell:v4mv:cbp:last_pred=1:dia=-1:cmp=0:vb_strategy=1 -vf scale=" + widthOfFile + ":" + heightOfFile + " -ofps 12 -srate 22050";
try
{
System.Diagnostics.Process.Start(FilestartInfo);
CatchImg(flv_file, imgFile);
}
catch
{
return "";
}
return "";
}
#endregion
}
}
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
- C#中子類調(diào)用父類的實(shí)現(xiàn)方法
- PHP調(diào)用C#開發(fā)的dll類庫(kù)方法
- C#調(diào)用C++版本dll時(shí)的類型轉(zhuǎn)換需要注意的問(wèn)題小結(jié)
- C#使用Process類調(diào)用外部exe程序
- C#使用Process類調(diào)用外部程序分解
- C#調(diào)用Java類的實(shí)現(xiàn)方法
- SQL Server中調(diào)用C#類中的方法實(shí)例(使用.NET程序集)
- C#中派生類調(diào)用基類構(gòu)造函數(shù)用法分析
- C#中調(diào)用VB中Inputbox類的實(shí)現(xiàn)方法
- HttpHelper類的調(diào)用方法詳解
相關(guān)文章
c#檢測(cè)usb設(shè)備撥插類庫(kù)USBClassLibrary分享
這篇文章主要介紹了c#檢測(cè)usb設(shè)備撥插類庫(kù)USBClassLibrary的簡(jiǎn)單示例,需要的朋友可以參考下2014-04-04
Unity3D UI Text得分?jǐn)?shù)字增加的實(shí)例代碼
這篇文章主要介紹了Unity3D UI Text得分?jǐn)?shù)字增加方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
WPF實(shí)現(xiàn)在控件上顯示Loading等待動(dòng)畫的方法詳解
這篇文章主要介紹了WPF 如何在控件上顯示 Loading 等待動(dòng)畫,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下2023-03-03
C#服務(wù)端圖片打包下載實(shí)現(xiàn)代碼解析
這篇文章主要介紹了C#服務(wù)端圖片打包下載實(shí)現(xiàn)代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
利用WPF實(shí)現(xiàn)Windows屏保的制作
屏保程序的本質(zhì)上就是一個(gè)Win32?窗口應(yīng)用程序。本文將利用WPF實(shí)現(xiàn)Windows屏保的制作,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們學(xué)習(xí)WPF有一定幫助,感興趣的可以了解一下2022-07-07

