c#网页视频文件通用抓取(包括直播流等)

几天前一个同学说想下载一个网站的视频找不到连接,问我有没有什么办法。当时一听觉得应该简单,于是说我抽空看看。然后就分析目标网页,试图从网页源码里找出连接,未果。F12调出开发者工具,进NetWrok看到网页是通过ajax发起xhr请求拿的视频连接,怪不得页面元素里没有下载地址,请求的是m3u8格式文件,查了一下这是一种分片的流媒体文件,然后到处找下载这种格式文件的工具,都不是很理想。很多都是直接下了分片后的ts文件,但是这个网站的是加了密的,不能直接播放,最后找到ffmpeg这个视频插件神器,视频转码、剪切、合并、播放都不在话下,还支持多平台。
ffmpeg FFmpeg介绍和入门
ffmpeg开 FFmpeg官方网站
有了神器何不自己写个工具来下载呢,准备动手时首先就被连接怎么获取这个问题给拦住了,原本只是想写个小爬虫,爬取网页连接就行了。结果行不通,ajax动态发起的请求,数据不在网页元素里,对js也不熟悉不知道怎么获取这种数据,难不成让同学自己手动开浏览器F12然后去找连接?这不是我的风格:) 然后继续各种搜索,得出个结果自己实现浏览器,拦截网页所有请求肯定就拿到了。筛选后得到三种方案:

1.WebBrowser.
2.GeokoFx.
3.CefSharp.

首先试了WebBrowser,目标网站直接打不开网页,让换谷歌浏览器,修改了UserAgent可以打开,但是网页显示不全,放弃。然后换GeokoFx直接能打开,速度也不错,但是有些连接点击了没反应,也只能放弃。最后用CefSharp测试达到了预期目标,就是flash和H264视频打不开,折腾了一天,官方说是版权问题不支持,需自行修改。找了个修改过的库可以了,找到的支持flash和H264视频的库: https://pan.baidu.com/s/14sYhaltGJe8Fe9ALgHGESQ
提取码:dfdr
是nupkg的安装包,查看nupkg安装方法
然后就是写代码了:
视频地址获取只要继承集成默认的抽象类 DefaultRequestHandler就可以了.

public class MyRequestHandler : DefaultRequestHandler
 {
 public override CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
  {
       //拿到url后再判断下是不是视频文件
       string url = request.Url;
   }
}

然后在初始化浏览器时指定下就行了。

chromeBrowser.RequestHandler = new MyRequestHandler(callback);

这里我是把url中的文件名提取出来,然后判断扩展名来判断是不是视频文件,不知道有没有更通用的方法。判断ResourceType == ResourceType.Media是不行的,很多时候这个值返回的是xhr。

FFmpeg部分就是直接命令行调用下,有时间再研究下这个神器的lib方式。

以下是折腾了几天出来的结果。
5.png
可以在这里进行下载,播放等操作,界面丑了点,功能算是达到了。
下载支持断点续传,但是m3u8分片文件没有保存断点,所以关了软件后不能断点续传,要重新开始。直播流不能预知大小,所以不显示下进度,但是适时更新下载的数据大小。
一般情况下ts文件不用去下载,直接下m3u8就可以了,程序会自动分析ts分片文件全部下载完后自动合成一个mp4文件。
软件下载:链接:https://pan.baidu.com/s/1R9jQ-ALYRqEGyX4RnfRu-w
提取码:n6q4
如果运行不了,请下载并安装NET Framework  4.6.1

你可能感兴趣的:(c#,ffmpeg,视频播放器,网页抓包,视频编码)