通过flv的url得到视频截图
先得说一下,这个只能通过flv的url地址得到图片,本来也是打算做通过视频网站的url得到图片的,但是实现起来不容易,各大视频网站极力隐藏他们的地址(后篇有对此的一些 研究:通过flv的url得到视频截图)。flv的实际物理地址往往不会那么容易让你得到,ajax调来调去的,不同的网站实现方法还不一样,虽然通过模拟之一过程可以实现,但是太费事了,还得为没个网站做一个实现。不过我想如果找到一个解析页面,同时他也能解析js的组件就好办了,按照正常页面的解析顺序,将type=“video/x-flv”的请求就是我们想要flv的实际地址。不知道有没有?
那就说我做的小部分工作了, 前面的在说,加入我们得到了flv的实际地址,那怎么对其截图呢。ffmepg是一个很好的工具,可以做视屏转化等工作,现在那他截图。他是一个exe文件,通过命令行调用。
ffmepg下载地址: http://ffdshow.faireal.net/mirror/ffmpeg/ 我用的是里面最新版
ffmpeg只能对本地文件操作,当然我们得先把文件给下下来,当时一般文件几十M不算过分,难不成我们要一直等着?当然不是啊,截图也不是截最后的图片,flv应该是顺序文件,下载前部分就能播放了,那就下载100K(多些也行);
代码
private void SaveTempFlv(string url, string fileName,int sizeKB)
{
HttpWebRequest wr = (HttpWebRequest)HttpWebRequest.Create(url);
wr.Method = "get";
HttpWebResponse rs=(HttpWebResponse)wr.GetResponse();
BinaryReader br=new BinaryReader( rs.GetResponseStream());
FileStream fs= File.Create(Server.MapPath("") + "\\"+fileName);
int byteread = 1;
int tempsize = 0;
byte[] bt = new byte[1024];
{
HttpWebRequest wr = (HttpWebRequest)HttpWebRequest.Create(url);
wr.Method = "get";
HttpWebResponse rs=(HttpWebResponse)wr.GetResponse();
BinaryReader br=new BinaryReader( rs.GetResponseStream());
FileStream fs= File.Create(Server.MapPath("") + "\\"+fileName);
int byteread = 1;
int tempsize = 0;
byte[] bt = new byte[1024];
while ((byteread = br.Read(bt, 0, 1024))>0)
{
tempsize+=byteread;
if (tempsize >= sizeKB*1024)
break;
fs.Write(bt, 0, byteread);
Response.Write(byteread+"</br>");
}
br.Close();
fs.代码
{
tempsize+=byteread;
if (tempsize >= sizeKB*1024)
break;
fs.Write(bt, 0, byteread);
Response.Write(byteread+"</br>");
}
br.Close();
fs.代码
Close();
fs.Dispose();
}
fs.Dispose();
}
截图:代码
public string CatchImg(string vFileName)
{
string ffmpeg = Server.MapPath("") + "\\" + "ffmpeg.exe";
if (!System.IO.File.Exists(ffmpeg))
return "";
string flv_img = Path.ChangeExtension(vFileName, ".jpg");
string flv_img_p = Server.MapPath(flv_img);
vFileName = Server.MapPath(vFileName);
string FlvImgSize = "500x400";
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.Arguments = " -i " + vFileName + " -y -f image2 -ss 1 -s " + FlvImgSize + " " + flv_img_p;
// -ss 后面的是搜索指定时间,1表示1s。100K应该都有1s吧~~
System.Diagnostics.Process.Start(startInfo);
return flv_img;
}
{
string ffmpeg = Server.MapPath("") + "\\" + "ffmpeg.exe";
if (!System.IO.File.Exists(ffmpeg))
return "";
string flv_img = Path.ChangeExtension(vFileName, ".jpg");
string flv_img_p = Server.MapPath(flv_img);
vFileName = Server.MapPath(vFileName);
string FlvImgSize = "500x400";
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.Arguments = " -i " + vFileName + " -y -f image2 -ss 1 -s " + FlvImgSize + " " + flv_img_p;
// -ss 后面的是搜索指定时间,1表示1s。100K应该都有1s吧~~
System.Diagnostics.Process.Start(startInfo);
return flv_img;
}
调用:
SaveTempFlv("http://www.ncuhome.cn/video/Upload/201003121301337349132.flv", "1.flv",100);
Response.Write(CatchImg("1.flv"));
//将得到1.jpg截图
如果没用先用命令行试试,是不是参数设置有误,有时间在看看怎么获取flv地址。
ps
·····················
下面是后期完成的,不过不是很完善,大概实现了通过视频网站的url得到对应截图的功能。