2012-10-17 64 views
1

我需要播放.swf文件,然後當文件更改爲重新加載播放器與新的內容。可悲的是,我選擇的程序不會監視文件的變化。我想出了一個有點複雜的解決方案:使程序重新加載文件更改已打開的文件

sudo apt-get install incron gtk-gnash 
echo "my_username" | sudo tee -a /etc/incron.allow # allow my_username to run incron 
incrontab -e 

添加以下incrontab:

/home/my_username/path/myfile.swf IN_MODIFY /home/my_username/path/run.sh 

run.sh包含:(也chmod 700 run.sh

#!/bin/sh 
killall gtk-gnash 
gtk-gnash /home/my_username/path/myfile.swf 

正如你可以看到這遠非優雅。我該怎麼辦呢?

這是在Ubuntu 12.04上,如果這對你很重要。這是我自己的question上askubuntu重複

編輯:澄清,我選擇使用GTK的咬牙切齒,一個獨立的播放器,這不是必需的,Web瀏覽器會做太多,但似乎沒有必要

+0

如何在SWF包裝器中啓動現有的SWF,如何定期檢查更新,如果看到更新,則重新加載子SWF?您是否有能力生成SWF,或者您的解決方案必須基於服務器? (關於一個JavaScript處理程序,我用SWF包裝程序做了什麼?)問題是,客戶端更容易輪詢查找更改,而不是服務器將某些內容推送到已下載SWF並關閉連接。 – ghoti

+0

我在另一個bash腳本中自己生成SWF,然後替換已經播放的swf。只要有新內容可用,就會發生此情況這些都是在本地完成的,輸出SWF在某個走廊的屏幕上播放。如果我正確地理解了你,JS包裝必須是來自瀏覽器內部的腳本,我猜這樣的JS無法意識到磁盤更改,只能定期重新加載,這是一個輕微的性能問題)。另外,我對JS並不熟練,並且希望保持這種狀態;)(我認爲這是一個不必要的複雜因素,必須有一個更簡單的解決方案)。 – bartekbrak

+0

所以你在獨立播放器中啓動這個SWF?這將是有用的信息開始。如果是這種情況,您可以簡單地在一個循環中運行播放器,然後讓一個單獨的進程監視更改,如果播放器發現有變化,就會導致播放器死機。如果這聽起來不錯,我會發佈一個答案。 – ghoti

回答

2

你所描述的是File Alteration Monitor的工作。

首先,您已有的「incrontab」解決方案是一個很好的起點,因爲您正在從shell啓動。 incrontab是一個基於inotify(7)的解決方案,這是一個巨大的優勢。這意味着你不是輪詢,這節省了CPU。你需要shell和系統級解決方案,我不是Flash程序員,所以我會堅持你的問題,儘管我認爲更好的解決方案是創建一個Flash「包裝器」也許使用AS3 Loader類來吸收現有的SWF,並從incrontab發起的事件接收通知。 Flash編程已經超出了這個答案的範圍,儘管它可能會提供更優雅的解決方案。

所以......

您當前的方法由啓動腳本首先殺死任何現有gtk-gnash過程然後運行一個新的。當incrontab發現文件發生變化時,它會從頭開始重新啓動。如果您相信您的Flash應用程序永遠不會崩潰並退出,並且您始終擁有完美的時機,那麼這是一個可行的解決方案。其中一個問題是,在一個過程的死亡和下一個過程的開始之間你有一個未知的延遲。您的killall發送一個信號,其中gtk-gnash可能立即響應或暫停後響應。暫停一下,你可能會發現自己在舊版本完全離開之前啓動了SWF。暫停較長時間後,您可以簡單地顯示桌面。

一個更好的解決方案可能是簡單地在一個循環中啓動SWF:

#!/bin/sh 

while true; do 
    date '+[%Y-%m-%d %T] myfile.swf relaunched' >> /var/log/swf.log 
    gtk-gnash /home/my_username/path/myfile.swf 
done 

然後有incrontab僅僅殺死現有工藝:

/home/my_username/path/myfile.swf IN_MODIFY killall gtk-gnash 

通過從發射分離killall,你確保gtk-gnash的新實例不會啓動,直到舊實例退出並將控制權返回給包裝它的shell腳本。

當然,而是採用incrontab,你可以或者安裝inotify-tools包,並留下一個循環運行:

#!/bin/sh 
while inotifywait -e modify /home/my_username/path/myfile.swf; do 
    killall gtk-gnash 
done 

同樣的系統調用,同樣的效果,不同的前端。

如果您希望仔細查看您正在查殺的進程,還可以將gtk-gnash的pid存儲在臨時文件中。這裏的另一個採取的flash播放器包裝:

#!/bin/sh 

while true; do 
    date '+[%Y-%m-%d %T] myfile.swf relaunched' >> /var/log/swf.log 
    gtk-gnash /home/my_username/path/myfile.swf & 
    echo $! > /var/run/gtk-gnash.pid 
    wait 
done 

而且incrontab行:

/home/my_username/path/myfile.swf IN_MODIFY xargs kill < /var/run/gtk-gnash.pid 

你可能會採用降低殺/重啓可見效果的另一種策略,是採取myfile.swf的屏幕截圖,當它運行時內容很少或沒有時,就用它作爲播放器上的桌面牆紙。 (或者等價的,我不知道你是如何設置的)。我爲幾年前設立的數字標牌解決方案做了類似的事情 - 我們不時需要殺死和重啓獨立播放器,所以我們只是顯示出來的第一頁的「框架」。當我們殺死flashplayer進程時,系統「似乎」重置,其框中沒有內容......然後,一秒鐘後,內容就會顯示出來。 (是的,這是一個黑客。)

另一個提示:我一直髮現Adobe的獨立Flash播放器(「投影儀」)比gtk-gnash更可靠和更兼容。您可以在Adobe Support Centre Download Page找到Adobe的獨立播放器,這與標準的Flash Player下載頁面不同。

+0

謝謝,這是一個徹底的答案,也感謝你的投影機提示,不幸的是,Adobe是Adobe,他們不支持命令行很好(根本不?),甚至沒有 - 全屏幕參數,我需要另一個解決方法(容易,但仍然),gnash將不得不滿足 – bartekbrak

+0

Fullscreen功能在Flash中控制。在主時間軸中,在第一幀中包含以下內容:'fscommand(「fullscreen」,「true」);'。這在AS2中適用於我。在AS3中,我相信你會使用Stage類的displayState屬性:'stage.displayState = StageDisplayState.FULL_SCREEN;'More info is [here](http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS2E9C7F3B- 6A7C-4c5d-8ADD-5B23446FBEEB.html)。 – ghoti

+0

我通過使用pdf2swf連接一堆pdf來創建swf,所以它是一個不同的故事 – bartekbrak