郭大春
我的“診斷手記”
編者按:如果您是信息技術(shù)教師,或善于鉆研各種技術(shù)問題,那么在生活中,在教學(xué)中,一定親歷過無數(shù)的技術(shù)障礙,實(shí)施過不勝枚舉的解決方案,有冥思苦想時的抽絲剝繭,更有揮劍斬棘時的暢快淋漓。總有那樣一些“排雷”過程,讓您記憶猶新,總有那樣一些隱性的相關(guān)性讓您不斷刷新自己的認(rèn)知。
現(xiàn)在,我們?yōu)槟_設(shè)了這樣一個陳列館,期待您能夠?qū)⑦@些珍貴的“診斷手記”陳列出來,在展示自己“技藝”的同時也為大家提供更多可供借鑒的思路和經(jīng)驗(yàn)。
● 突遇新情況
我剛上完課,走進(jìn)辦公室,就見王老師早等在我的電腦旁了。見了我便迫不及待地說:“大春,幫看看,我這個視頻怎么打不開??!”
我一邊拖過鼠標(biāo),一邊說,視頻文件沒帶上吧?“不會的,SWF課件能播放視頻;但發(fā)布成EXE后播放視頻就成了一片空白了!”王老師一邊說著,一邊示意我分別打開SWF和EXE兩個版本的課件,果然是那樣!
我打開Flash源文件,只見他在調(diào)用外部視頻的幀上寫著以下兩行代碼。
_root.createEmptyMovieClip ( "swf_mc", 1 );
_root.swf_mc.loadMovie ( "Flv/Tea.flv" );
我思忖著,沒錯啊,第一行創(chuàng)建一個影片剪輯swf_mc,第二行往swf_mc中裝入外部影片“Flv/Tea.flv”。我再到文件夾里查看,跟FLA文件在一起,果然有一個Flv文件夾,里面也有一個能夠正常播放的Tea.flv。
這下可真讓人困惑了!到處都沒有錯,可結(jié)果卻是錯的——調(diào)不出視頻。
● 尋找禍根源
問題出在哪兒呢?是不是因?yàn)槭褂昧讼鄬β窂?,?dǎo)致EXE課件找不到Tea.flv文件。于是,我嘗試著將EXE課件和Flv文件夾一起復(fù)制到我的電腦C盤根目錄下,并將第二行語句改成:“_root.swf_mc.loadMovie ( "C:/Flv/Tea.flv" );”。 隨后,我雙擊運(yùn)行EXE課件,奇跡出現(xiàn)了,視頻調(diào)用成功。
● 一波又三折
我大喜過望,以為使用絕對路徑就可以成功調(diào)用。如何使用絕對路徑呢?怎不能要求每次使用課件的時候,都把它固定地放在一個相同的位置?我想到了Flash AS中的“_url”屬性——獲取文件路徑,然后截取路徑中從開頭到最后一個斜杠處的所有字符,再連上“/Flv/Tea.flv”,這樣,一個動態(tài)的絕對路徑便出來了。
于是我回到王老師的U盤中,打開源文件,將調(diào)用視頻的兩行代碼改成如下三行:
fileName = _url.substr(0, _url.lastIndexOf("/"))+"/Flv/Tea.flv";
_root.createEmptyMovieClip ("swf_mc", 1 );
_root.swf_mc.loadMovie(fileName);
保存后發(fā)布成SWF課件和EXE課件,雙擊運(yùn)行,竟被當(dāng)頭潑了一瓢冷水——問題依舊:SWF能播放外部視頻,EXE卻一片空白。
● 不識真面目
我又試著在場景中添加了一個動態(tài)文本框,命名為:fn_txt,然后在時間軸那三行代碼之后再補(bǔ)上一句:fileName _txt.text = fileName;——看看這個視頻文件的路徑到底變成了什么面目!
再次保存后發(fā)布成SWF和EXE兩種格式的課件,雙擊運(yùn)行,結(jié)果真讓人匪夷所思─SWF課件中的文本框顯示的是正常的“file:///M|/我的課件/Flv/Tea.flv”;而EXE課件中的文本框顯示的卻是“file:///M|/鎴戠殑璇句歡/Flv/Tea.flv” —— 路徑中的漢字都成了亂碼。
原來,一切根源都在于Flash不識漢字真面目!
● 迎刃而不解
于是,我百度了一下“Flash exe 調(diào)用外部文件 問題”,可結(jié)果大多是類似這樣的答案:“也遇到過這個問題,但最后知道EXE不支持loadmovie()。”哎,看來還是得自己尋求解決辦法。于是詳細(xì)查看Flash幫助,了解字符編碼方面的知識,找到了一個escape(expression)函數(shù)——將參數(shù)轉(zhuǎn)換為字符串,并以URL編碼格式進(jìn)行編碼,在這種格式中,將所有非字母數(shù)字的字符都轉(zhuǎn)義為%十六進(jìn)制序列。這正是我所需要的,于是我趕快將Flash課件中的ActionScript改成這樣:
fileName = _url.substr(0, _url.lastIndexOf("/"))+"/Flv/Tea.flv";
fileName = unescape(escape(fileName));
_root.createEmptyMovieClip("swf_mc",1 );
_root.swf_mc.loadMovie (fileName);
fileName _txt.text = fileName;
這樣在loadMovie之前(第二行)用escape對調(diào)用的外部文件名進(jìn)行URL編碼,再用一個unescape把URL 編碼的路徑再解碼回來。我很天真地以為這樣就能解決Flash的漢字識別問題。但再次運(yùn)行,終于讓人徹底失望了——EXE課件對外部文件路徑的解碼還是一堆亂碼。
后來,我通過進(jìn)一步探究,發(fā)覺escape編碼和unescape解碼都是多余的,在ActionScritp的第一行語句中,就根本沒有獲取正確的外部文件路徑——打包進(jìn)去的播放器沒有獲取正確的中文文件名。
● 原來卻如此
看來采用“file:///”形式的絕對路徑行不通——因?yàn)橛脩舨荒艽_保整個路徑中沒有漢字,而播放器對漢字文件名又不識別。這時我想到了斜杠(“/”),在網(wǎng)站程序編寫中,斜杠用來分隔目錄,而第一個斜杠則代表網(wǎng)站的根目錄,處于根目錄下的主頁文件對網(wǎng)站資源的調(diào)用有兩種方式——絕對路徑調(diào)用(從根目錄“/”開始)和相對路徑調(diào)用(從當(dāng)前目錄開始)。
能不能把Flash的EXE課件也想象成網(wǎng)站的首頁呢?那么,它要調(diào)用同一文件夾里的Flv目錄中的外部文件,除了前面嘗試的“file:///”形式的絕對路徑之外,還有兩種方式:“Flv/Tea.flv”和“/Flv/Tea.flv”,前一種人們慣用的方式行不通,那么“/Flv/Tea.flv”方式呢?于是,我將上面的ActionScript改成這樣:
fileName = "/Flv/Tea.flv";
_root.createEmptyMovieClip( "swf_mc",1 );
_root.swf_mc.loadMovie (fileName);
發(fā)布成SWF和EXE兩種格式的課件,居然都運(yùn)行通過,終于調(diào)出了久違的視頻。
● 問題得徹解
問題解決了,我沾沾自喜一陣子之后,總覺得發(fā)布成EXE的Flash課件不能識別漢字文件名,是一個嚴(yán)重缺陷,是Flash播放器的一個令人遺憾的Bug,那么,高版本的播放器應(yīng)該會有改進(jìn)吧?于是,我改用10.0的播放器打開SWF課件,然后,單擊“文件”、“創(chuàng)建播放器”,生成EXE課件,對三種路徑調(diào)用方式分別進(jìn)行測試,結(jié)果如下表所示。
從上表可見,如果你的課件用8.0的播放器打包成EXE文件,只有使用“/Flv/Tea.flv”這種形式調(diào)用外部素材;而“/Flv/Tea.flv”這種形式的外部文件調(diào)用在10.0的播放器中,又被全盤否定了——不管是SWF格式還是EXE格式,都應(yīng)采用“Flv/Tea.flv”這種調(diào)用方式。
幾天后,我把上面這個表格交給王老師,并說出的我觀點(diǎn)和建議。王老師親自實(shí)踐后,拍著腦袋高興地說,總算明白了,以后調(diào)用外部文件再也不會暈頭轉(zhuǎn)向了!