web-dev-qa-db-ja.com

バッファリングされたフラッシュビデオを保存するにはどうすればよいですか(Linuxの場合)?

以前は、任意のブラウザ(Firefox、Chromeなど)でバッファリングされたフラッシュビデオを抽出する方法がありました。これは、コマンド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)

それらのどれもメディアコンテンツを含んでいません。

そして、ビデオは再生するたびにサーバーからストリーミングされるため(ブラウザー固有のプラグインの助けを借りずに)、再生中のビデオを(Linuxで)把握できる方法があると確信しています。

5
Determinant

あなたは「クロムによって使用されるすべてのfdは次のとおりです:...それらのどれもメディアコンテンツを含んでいません」と言います。ただし、すべてが単一のプロセスによって所有されているように見える開いているファイルはほとんどありません。通常はchromeが実行されます。どのようにしてその情報を取得しましたか?

私のマシン(LinuxMintおよびChrome 28.0.1500.95))では、ストリーミングされたフラッシュファイルを探している場所で取得できました。プロセスで何かが不足していると思われます。

まず、実行中のプロセスを特定する必要があります pepper そして、ファイルに対応するファイル記述子IDを見つけます。

これは、/procとプロセスごとのfdディレクトリのおかげで可能です。

ビデオをブラウザウィンドウで開いた状態で、次のコマンドを実行します。

for ID in $( pgrep chrome ) ; do ( Sudo ls -l /proc/$ID/fd|grep Pepper ) && echo /proc/$ID/fd; done

出力は次のようになります。

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

リンクが指しているパスは無視してください。削除されます。 /proc/$PROCID/fd/$FDID経由でファイルにアクセスする必要があります

上記の例では、次のように実行します。

Sudo cat /proc/1196/fd/29 > my_video.flv

[編集]

クロムについても同じことを行うには、プロセス名を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

[編集](再び)

このワンライナーは、chromeとchromeの両方で機能するはずです(少なくとも私のマシンでは機能しました):

for ID in $( pgrep -f chro ) ; do ( Sudo ls -l /proc/$ID/fd|egrep "(/tmp/Flash|Pepper)" ) && echo /proc/$ID/fd; done
1
silviot

スクリプトで@silviotのメソッドを使用することもできます。

#!/bin/bash
#
# Show all chrome cached video files!
#
for ID in $( pgrep chrom ) ; do 
    Sudo ls -l /proc/$ID/fd|grep Pepper|cut -d' ' -f9|sed "s/\(.*\)/\/proc\/$ID\/\1/g"
done | grep -v '^$'

複数のビデオを実行してこれをテストしていませんが、動作するはずです。

1
urban