前公司在制作播客系統(web程序)中,用到從視頻截圖功能.
下邊是截圖catchimg方法,可從大多數的視頻文件中截圖成功,大家可測試;
如果截圖不成功,大多是因為視頻本身的問題,如編碼標準或加了密.
但從在線錄制的視頻flv文件中截圖,還未發現截圖失敗;
/// <summary>
/// @從視頻文件截圖,生成在視頻文件所在文件夾
/// 在web.config 中需要兩個前置配置項:
/// 1.ffmpeg.exe文件的路徑
/// <add key="ffmpeg" value="e:/ffmpeg/ffmpeg.exe" />
/// 2.截圖的尺寸大小
/// <add key="catchflvimgsize" value="240x180" />
/// 3.視頻處理程序ffmpeg.exe
/// </summary>
/// <param name="vfilename">視頻文件地址,如:/web/flvfile/user1/00001.flv</param>
/// <returns>成功:返回圖片虛擬地址; 失敗:返回空字符串</returns>
public string catchimg(string vfilename)
{
//取得ffmpeg.exe的路徑,路徑配置在web.config中,如:<add key="ffmpeg" value="e:/ffmpeg/ffmpeg.exe" />
string ffmpeg=system.configuration.configurationsettings.appsettings["ffmpeg"];
if ( (!system.io.file.exists(ffmpeg)) || (!system.io.file.exists(vfilename)) )
{
return "";
}
//獲得圖片相對路徑/最后存儲到數據庫的路徑,如:/web/flvfile/user1/00001.jpg
string flv_img = system.io.path.changeextension(vfilename,".jpg") ;
//圖片絕對路徑,如:d:/video/web/flvfile/user1/0001.jpg
string flv_img_p = httpcontext.current.server.mappath(flv_img);
//截圖的尺寸大小,配置在web.config中,如:<add key="catchflvimgsize" value="240x180" />
string flvimgsize=system.configuration.configurationsettings.appsettings["catchflvimgsize"];
system.diagnostics.processstartinfo startinfo = new system.diagnostics.processstartinfo(ffmpeg);
startinfo.windowstyle = system.diagnostics.processwindowstyle.hidden;
//此處組合成ffmpeg.exe文件需要的參數即可,此處命令在ffmpeg 0.4.9調試通過
startinfo.arguments = " -i " + vfilename + " -y -f image2 -t 0.001 -s " + flvimgsize + " " + flv_img_p ;
try
{
system.diagnostics.process.start(startinfo);
}
catch
{
return "";
}
///注意:圖片截取成功后,數據由內存緩存寫到磁盤需要時間較長,大概在3,4秒甚至更長;
///這兒需要延時后再檢測,我服務器延時8秒,即如果超過8秒圖片仍不存在,認為截圖失敗;
///此處略去延時代碼.如有那位知道如何捕捉ffmpeg.exe截圖失敗消息,請告知,先謝過!
if ( system.io.file.exists(flv_img_p))
{
return flv_img;
}
return "";
}
待解決問題:
就是我無法從ffmpeg.exe捕捉截圖失敗消息~
不知能看到這篇日志的行家可否有辦法取得,我目前只能通過檢測圖片是否生成來判斷成功與否,但時間較慢,因為這個檢測程序就讓用戶要多等大概4,5秒時間.
新聞熱點
疑難解答