今天讨论网页视频流抓取问题,针对Firefox浏览器,有两种方法。

  1. 直接从Firefox的缓存中获取;
  2. 利用flash流的进程号,在系统/proc下抓取缓存的数据流。

Firefox 缓存提取

Firefox的缓存保存在如下的路径中,其中f176xa6s.default不同的用户会不同,其他路径成分基本相同。

1
~/.cache/mozilla/firefox/fl76xa6s.default/cache2/entries

进入缓存文件夹后,便可以根据时间和文件大小搜索缓存文件。因为文件名是16进制编码的,无法体现文件内容,所以不考虑。

1
$ ls -lSt

其中-S表示按文件大小排序,-t表示按时间先后排序。

通常视频文件大小为MB量级,所以一般排序在前的几个文件会是缓存的视频。

Firefox flash flow 抓取

从Firefox网页抓取flash插件播放的视频流的步骤分为三步,(1) 打开视频、(2) 获取flash播放进程ID、(3) 视频流转存。

Step1 打开视频

在浏览器播放视频,此处需要firefox支持flash,或者安装adobe flash插件。

Step2 获取flash播放进程ID

利用lsof抓取正在运行的Flash进程,如下

1
$ lsof | grep Flash

会输出如下类似的结果,其中31346即为目标ID.

1
plugin-co 31346 user 26u REG 8,5 4561004 787806 /tmp/FlashXXJa3CWn (deleted)

Step3 视频流转存

参考博客: Linux下的浏览器播放flv视频都是采用的Flash播放器,而Flash播放器在播放每个视频的时候都会在/tmp目录下创建以“Flash”字样开头做标识的缓存文件,但是如果我们进入到/tmp目录下察看所有文件,却找不到正在播放的缓存文件,因为这些视频缓存文件只有系统可见,对用户是隐藏的。因此,我们可以根据Flash进程的ID,进入系统进程文件/proc下,获取缓存的视频流。

1
2
3
$ ls /proc/31346/fd
# 找到类似如下的行,其中 26 便是视频流缓存
lrwx------ 1 user user 64 Jan 12 12:07 26 -> /tmp/FlashXXJa3CWn (deleted)

利用cat管道,将数据流输入到.flv文件中。

1
$ cat /proc/31346/fd/26 > ~/Desktop/test1.flv

视频格式转换

利用mencoder可以对视频文件进行格式转换,

1
$ mencoder -ovc lavc -lavcopts vcodec=mpeg4 -oac mp3lame source.flv -o dest.mp4

其中参数含义如下,参考了此文

  • -ovc lavc:(output video codec)指定输出视频文件的视频编码类型,此处选择的是 Libavcodec 的视频编码;

  • -lavcopts vcodec=mpeg4:(Libavcodec options)指定视频编码的设置,由于 Libavcodec 包含了多种视频编码,所以用 vcodec=mpeg4 来指定具体的使用 MPEG-4 编码;

  • -oac mp3lame:(output audio codec)指定输出媒体文件的音频编码类型,此处选择的是 mp3lame;

References

[1] Linux下提取保存浏览器中的视频
[2] linux下视频格式转换工具