以前は、任意のブラウザ(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で)把握できる方法があると確信しています。
あなたは「クロムによって使用されるすべての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
スクリプトで@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 '^$'
複数のビデオを実行してこれをテストしていませんが、動作するはずです。