如何保存缓冲的 Flash 视频(在 Linux 上)?

Det*_*ant 5 video linux firefox google-chrome flash-video

曾经有一种方法可以在任何浏览器(如 firefox、chrome 等)中提取缓冲的 Flash 视频,该方法利用该命令ps并监视fd指向内存中临时文件的 。不幸的是,这种方法不再有效。例如,所有fd铬使用的是:

chrome    19412  ymf   69u   REG   0,14   470364     0  270129 /dev/shm/.org.chromium.Chromium.1fzPuo (deleted)
chrome    19412  ymf   77u   REG   0,14   131060     0  270141 /dev/shm/.org.chromium.Chromium.94K6Di (deleted)
chrome    19412  ymf  103u   REG    8,5     2052     0 4230990 /var/tmp/etilqs_01QDHFotJcLOpBS (deleted)
chrome    19412  ymf  112u   REG    8,5    24600     0 4232788 /var/tmp/etilqs_tFao7GamL5cslaZ (deleted)
chrome    19412  ymf  188u   REG    8,6    16384     0 1310851 /home/ymf/.config/chromium/Default/History Index 2013-07-journal (deleted)
chrome    19412  ymf  189u   REG    8,5    16400     0 4232787 /var/tmp/etilqs_D5p3BT7rtTSWLsy (deleted)
Run Code Online (Sandbox Code Playgroud)

它们都不包含媒体内容。

而且我坚信我们可以通过某种方式控制正在播放的视频(在 Linux 上),因为无论何时播放视频都是从服务器流式传输的(无需任何浏览器特定插件的帮助)。

sil*_*iot 1

你说“Chromium 使用的所有 fd 是:......它们都不包含媒体内容。” 但是您列出的打开文件很少,看起来全部属于单个进程。不是 chrome 的典型运行方式。你是如何得到这些信息的?

在我的机器(Linux Mint 和 Chrome 28.0.1500.95)上,我可以在您要查找的位置检索流式 Flash 文件。我怀疑你在这个过程中遗漏了一些东西。

首先,您需要识别正在运行pepper的进程并找到与您的文件对应的文件描述符id。

这要归功于/proc每个进程的fd目录

在浏览器窗口中打开视频后,运行以下命令:

for ID in $( pgrep chrome ) ; do ( sudo ls -l /proc/$ID/fd|grep Pepper ) && echo /proc/$ID/fd; done
Run Code Online (Sandbox Code Playgroud)

输出将类似于:

lrwx------ 1 root root 64 ago  2 12:52 29 -> /home/me/.chromecache/Default/Pepper Data/Shockwave Flash/.com.google.Chrome.ulDLo0 (deleted)
/proc/1196/fd
Run Code Online (Sandbox Code Playgroud)

忽略链接指向的路径:它已被删除。您需要通过访问该文件/proc/$PROCID/fd/$FDID

在上面的示例中,您将运行:

sudo cat /proc/1196/fd/29 > my_video.flv
Run Code Online (Sandbox Code Playgroud)

[编辑]

要对 chromium 执行相同的操作,请将进程名称从 更改为google-chrome并将chro要在文件名中查找的字符串更改为/tmp/Flash如下所示:

for ID in $( pgrep chro ) ; do ( sudo ls -l /proc/$ID/fd|grep /tmp/Flash ) && echo /proc/$ID/fd; done
Run Code Online (Sandbox Code Playgroud)

[编辑](再次)

这个单行应该适用于 chrome 和 chromium(至少在我的机器上是这样):

for ID in $( pgrep -f chro ) ; do ( sudo ls -l /proc/$ID/fd|egrep "(/tmp/Flash|Pepper)" ) && echo /proc/$ID/fd; done
Run Code Online (Sandbox Code Playgroud)