通过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/       我用的是里面最新版

 

ffmepg的参数说明-fromats 显示可用的格式
-f fmt 强迫采用格式fmt
-I filename 输入文件
-y 覆盖输出文件
-t duration 设置纪录时间 hh:mm:ss[.xxx]格式的记录时间也支持(截图需要)
-ss position 搜索到指定的时间 [-]hh:mm:ss[.xxx]的格式也支持
-title string 设置标题
-author string 设置作者
-copyright string 设置版权
-comment string 设置评论
-target type 设置目标文件类型(vcd,svcd,dvd),所有的格式选项(比特率,编解码以及缓冲区大小)自动设置,只需要输入如下的就可以了:ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 激活高质量设置

-b bitrate 设置比特率,缺省200kb/s
-r fps 设置帧频,缺省25
-s size 设置帧大小,格式为WXH,缺省160X128.下面的简写也可以直接使用:Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 设置横纵比 4:3 16:9 或 1.3333 1.7777
-croptop/botton/left/right size 设置顶部切除带大小,像素单位
-padtop/botton/left/right size 设置顶部补齐的大小,像素单位
-padcolor color 设置补齐条颜色(hex,6个16进制的数,红:绿:蓝排列,比如 000000代表黑色)
-vn 不做视频记录
-bt tolerance 设置视频码率容忍度kbit/s
-maxrate bitrate设置最大视频码率容忍度
-minrate bitreate 设置最小视频码率容忍度
-bufsize size 设置码率控制缓冲区大小
-vcodec codec 强制使用codec编解码方式. 如果用copy表示原始编解码数据必须被拷贝.(很重要)

-ab bitrate 设置音频码率
-ar freq 设置音频采样率
-ac channels 设置通道,缺省为1
-an 不使能音频纪录
-acodec codec 使用codec编解码

-vd device 设置视频捕获设备,比如/dev/video0
-vc channel 设置视频捕获通道 DV1394专用
-tvstd standard 设置电视标准 NTSC PAL(SECAM)
-dv1394 设置DV1394捕获
-av device 设置音频设备 比如/dev/dsp

-map file:stream 设置输入流映射
-debug 打印特定调试信息
-benchmark 为基准测试加入时间
-hex 倾倒每一个输入包
-bitexact 仅使用位精确算法 用于编解码测试
-ps size 设置包大小,以bits为单位
-re 以本地帧频读数据,主要用于模拟捕获设备
-loop 循环输入流。只工作于图像流,用于ffserver测试

      ffmpeg进行操作的常用方法:

    1.转换成flv文件:ffmpeg -i infile.* -y (-ss second_offset -ar ar -ab ab -r vr -b vb -s vsize) outfile.flv
               其中second_offset是从开始的多好秒钟.可以支持**:**:**格式,至于ar,ab是音频的参数,可以指定ar=22050,24000,44100(PAL制式),48000(NTSC制式),后两种常见,ab=56(视音频协议的codec而定,如果要听高品质,则80以上).vr,vb,vsize是视频参数,可以指定vr=15,25(PAL),29(NTSC),vb=200,500,800,1500(视视频协议的codec而定,可以通过查看专业的codec说明文档获取,如果你手头有一份详细的各种codec的文档,请提供一份给我,不胜感激.)
               还有一些参数-acodec ac -vcodec vc(ac指定音频codec,ar和ab可以省去,vc指定视频codec,vr和vb可以省去,自动采用相应的codec参数)
               还有很多高级参数,如-qmin,-qcale等,请查看详细文档.
               还有-an和-vn参数,分别从多媒体文件中提取出纯粹视频和音频.
               另,如果你是用shell批量处理,请使用-y参数覆盖生成flv.

    2.截取图片:ffmpeg -i infile.* -y (-ss second_offset) -t 0.001 -s msize (-f image_fmt) outfile.jpg
             其中second_offset同上,msize同vsize,图片大小.image_fmt=image2强制使用jpg,image_fmt=gif,强制使用gif格式.
             还可以用-vframes fn指定截取某帧图片,fn=1,2,3,...

 

   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];
         while ((byteread = br.Read(bt, 01024))>0)
         {
             tempsize
+=byteread;
             
if (tempsize >= sizeKB*1024)
                 
break;
             fs.Write(bt, 
0, byteread);
             Response.Write(byteread
+"</br>");
         }
        br.Close();
        fs.代码

 

Close();
        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;
    }

 

 

调用:

 SaveTempFlv("http://www.ncuhome.cn/video/Upload/201003121301337349132.flv""1.flv",100);

 Response.Write(CatchImg("1.flv"));
//将得到1.jpg截图

 

 

 如果没用先用命令行试试,是不是参数设置有误,有时间在看看怎么获取flv地址。

 

 ps

·····················

 下面是后期完成的,不过不是很完善,大概实现了通过视频网站的url得到对应截图的功能。

通过flv的url得到视屏截图

 

posted @ 2010-04-17 14:19  LittlePeng  阅读(175)  评论(0编辑  收藏  举报