跳到主要內容

Grinder OS X: My very first Cocoa App


Grider又更新了!現在,我們將OS X專用的Grider以Objective-C全面改寫,獲得了更佳的效能與,以及Mac原生的界面體驗。

用Processing內建的video函式庫來為影片打上格子,很容易寫,程式碼也很簡潔,但是它的效能實在不怎麼樣。光是單純的播放影片,就已經耗掉我電腦CPU一半的資源,加上其他的東西只會讓它更慢。可是使用Mac內建的QuickTime X播放同一個影片,佔用的CPU資源卻只有一點點。顯然,使用Mac提供的影音播放方式是個比較好的選擇 。

拿最後的成果來做個簡單的比較,下圖中PID 2410的Grider(上面的)是用Processing寫的,下方PID 2554的則是Xcode產生的,兩個Grider播放的是同樣的320x240影片。看得出來,在Mac的環境下,使用Xcode裡頭的函式庫無論是在CPU使用,或是記憶體的消耗上,都是個比較經濟的選擇。


就這樣,開始了Grider OS X的摸索。這一切的起點,來自於官網上一篇Creating a Simple QTKit Media Player Application,確實提供了一些Xcode的基本操作。但是,自從OS X 10.7之後,Apple引入AVFoundation這個Framework,並且慢慢將QTKit上的一些功能取消,很多網上找到的片段根本就無法執行。萬不得已之下,只能把核心轉換成AVFoundation,並且下載AVSimplePlayer這個sample code作為起始點。

AVSimplePlayer只有程式碼範例,沒有一步一步的建立說明。為了要看懂它究竟是如何運作,不得不去讀AV Foundation Programming Guide的內容,特別是Playback這個小節。


原來AVPlayer只是個controller,要取得影片資料,得進到AVPlayerItem,或直接從AVAsset裡頭讀取;要顯示畫面,則得要運用AVPlayerLayer。

我遇到的一個問題就是影片大小的獲取。舊的API可以直接從AVAsset中,直接讀naturalSize這個屬性。可它在OS X v10.8裡面被取消了。現在則要進入到AVAssetTrack當中,才能讀到naturalSize。解決這個問題之後,另一個難題則是Layer。

用過Photoshop的人大概都有圖層的概念,這裡的Layer作用也是一樣的。不同的是,我得要去讀Core Animation Programming Guide,才有辦法理解並且控制這邊Layer。我覺得,需要特別注意一下它的坐標系統,是從左下角開始算起的,和其他程式以左上角作為起點不同。


由於Layer可以堆疊,所以在影片上畫格子,加上滑鼠指標的追蹤點,或是在畫面上顯示訊息,都可以運用Layer來完成。需要的時候顯示,不用的時候隱藏,不需每次顯示影片畫格都要重新運算畫面。這個工作,Core Animation已經幫你做了。對了,要操作這些Layer的變化,需要導入QuartzCore這個Framework。

這些問題處理完之後,剩下的多半是使用者界面的問題。這個部分我也還不太熟悉,等到比較熟悉之後再寫。就這樣,Grider OS X差不多好了。


和Processing比較起來,Xcode裡面的程式碼多了很多,需要花費更多的開發時間。但是,如果要處理大量的影片,用Apple提供的工具應該還是個比較穩妥的做法。

PS. 在此之前,我對Objective-C這個語言是全然陌生的,所有的知識僅限youtube上的Xcode教學影片,還有一些網誌資料。直到現在,還有一些用法我都還搞不清楚。總之,見招拆招。

留言

熱門文章

差不多食譜實驗:小烤箱烤長茄子? Oven-roasted Long Aubergine?

發佈了「 差不多食譜:小烤箱烤茄子 Oven-roasted Aubergine 」之後,有位朋友在YouTube上留言問說,這個方法也可以用在市場上比較常看到的那種長茄子嗎?當時我只能回答不知道,因為沒試過。現在我有答案了!結果是一半一半!

差不多食譜:香煎南瓜片 Pan-fried Pumpkin

托爺爺的福,在萬聖節那碗「 南瓜盅飯 」後,我還有個老家的南瓜可以用。但要怎麼好好運用這顆南瓜,卻是個不小問題。差不多食譜曾經試過「 醋漬南瓜 」、「 牛奶南瓜 」,還有「 南瓜濃湯 」幾種運用新鮮南瓜的料理,難度雖然都不高,看起來卻都不像平時會出現在餐桌的家常菜。這次我們不妨搞得家常一點,用廚房裡都會有菜刀和煎鍋 (除非你家不開伙) ,來弄個超級家常的「香煎南瓜片」。

上車睡覺、下車尿尿

台灣人對於旅遊的形容,往往是「上車睡覺、下車尿尿」。這是因為行程被極度壓縮,試圖要在最短的時間裡面看最多的東西,於是每個景點都只是蜻蜓點水般匆匆帶過,停留的時間往往等同於排隊上廁所的時間。 這個紫南宮的行程已在「人山人海的紫南宮」當中提到過,只是當初沒寫到為什麼要去參觀紫南宮。事實上,紫南宮最富盛名的是可以借錢的土地公。然而,這點對我們家人而言一點吸引力都沒有,反倒是那號稱七星級的廁所,才是吸引我們前往參拜的重點。或許你會說:「有沒有搞錯,開一個鐘頭的車去上廁所!」沒錯,行程就是這麼規劃的。 在過年期間要到紫南宮上廁所還不是件容易的事。首先,你必須先開車到紫南宮,這大概是最容易的部份。接著,你就得面臨搶停車位窘境。 過年期間,不論哪個景點都是人山人海,免費停車位更是難找。紫南宮雖然提供一大片停車場,在過年期間卻也不敷使用,每台進入停車場的車都虎視眈眈,只要哪邊出現一個車位,起碼就有四、五台車等著。 好不容易停好車,接下來就得穿越那群要去借錢、還錢、拜拜的人群。在那個地方,怎麼前進的都不知道,反正總會有人把你向前推進。 好不容易到達造價上億的廁所,人山人海的盛況依舊。還好這群並非全部都來上廁所,要不然廁所早就被塞爆了。聽老爸老媽說,上次他們來的時候廁所裡面都沒人,還可以在裡面拍照、欣賞噴水。但這次裡面卻塞了不少人,我也不好意思拿著那麼大的一台相機拍人家上廁所的模樣,只能拍拍外觀。 由於是在盛產竹筍的竹山鎮,廁所的外觀也用竹筍作為造型,每個竹筍下方都是一間造價昂貴的廁所。一個令我覺得很貼心的設計在於,廁所不僅僅只是男廁/女廁,還有一個殘障廁所,方便行動不便的人。 雖然招牌寫著「金筍迎客」,但是看起來那個筍子明明就是不鏽鋼的,除非把它理解成金屬。我還特地爬上廁所的樓頂,想說能不能看到些什麼特別的風景。可是過年期間,看到的除了人群還是人群。 上完廁所後,簡單徒手祭拜了提供廁所的土地公,我們又再次穿越那重重的人群。不過,我還是偷偷跑去滾了一下那個象徵「財源滾滾」的金元寶。最後,又踏上那個停車戰場,從容地離去。 我不奢望有賺大錢的機會,只要生活能過得去,偶爾還能買些奢侈品犒賞自己就夠了。不過這個願望似乎也不簡單!