用 Swift 實作 Smalltalk MVC

在 Apple 開發圈,我們都很熟悉所謂的 MVC 設計模式——把整個程式裡的物件分成 Model、View 與 Controller 三種不同的角色,讓它們分別負責解決不同的問題。Model 物件專責資料的封裝與相關的基礎行為,View 物件代表使用者看得到的介面元件,而 Controller 物件負責把 Model 物件與 View 物件連結在一起。1它們之間的互動關係也被定義得很清楚:以 Controller 為核心去操控 View… Read more 用 Swift 實作 Smalltalk MVC

Swift 的各種 Type Polymorphism 配方

本文同步發表於 https://www.appcoda.com.tw/swift-polymorphism/ Polymorphism 是程式設計的基本概念之一,指同一個介面的背後可以有不同的實作。比如說在 UIKit 裡面的 UIImage,它的底層實作可能是 Core Image,也可能是 Core Graphics,但我們在 call site 通常不需要在意這些。另一個例子是 Swift 的 String,它的底層可能是 Swift 原生的也可能是從 NSString… Read more Swift 的各種 Type Polymorphism 配方

基本影片製作的技術流程管理

影片製作流程千百種,每一次製作都會有或多或少的差異。這邊講的是一些基本的概念。 從播放平台開始 電影學者們一直以來都會面對到怎麼定義電影的問題。膠卷本身是電影嗎?故事是電影嗎?影片檔呢?我自己是偏好將電影定義成觀影過程,也就是說在觀眾觀看電影的當下,電影才真正存在。同理,網路影片也是在閱聽者在螢幕上看到的時候才真正存在。所以電影並不是那個產品本身,而是包含了行銷與放映的一個觀影體驗。 從這個定義來延伸的話,所謂的製片,就應當以觀影體驗來進行。不過這是技術流程上而言的,對於創作面來說,我認為創作者應該要可以心無旁騖的創作,當然這是另一個話題了。在技術流程的設計上,總之就是要以最終的播放平台為前提來延展。比如說你要在 Instagram 上面放,那你就可以考慮把畫面比例設成正方形,然後人聲可能就要特別清楚,因為閱聽者可能是用手機的喇叭在聽。 流程管理 不成熟的製作常常會有一個特色:拍片團隊裡沒有包含後製部門的人,也沒有人知道後製部門需要什麼東西,反正拍完了把檔案丟給剪接跟混音團隊就好。這是完全錯誤的概念。嚴格來說,整個拍片期間的團隊的唯一工作,就是要生產影片素材給後製部門用。如果你不知道後製部門要什麼東西,那你是在拍什麼?如果你知道錯誤的影片格式或錄音方式可能會帶給後製部門上至數倍的工作量,你可能就會開始考慮前製期就先找後製部門的人來開個會了。 其實這種從頭到尾都考慮到後製需求的製片方式,可以以流程管理來總括。這裡面就包含了色彩管理、聲音管理、影片格式管理等等不同的面向,而它們都是需要從一開始就做的。有多一開始?最晚最晚也是要在租器材之前做吧,不然租了器材之後才發現這器材輸出的檔案是後製部門不喜歡的,那就很麻煩了。比方說你不知道從哪租到一個只能拍 25 FPS 的 PAL 攝影機,但你最後要交出去的格率規定是 30 FPS,那你是不是就要帶水果禮盒去請後製部門的人拜託他們幫幫忙了? 我原本寫了一大段前製期要幹嘛、拍攝期要幹嘛的段落,但那樣就不是流程管理的思考方式了。所以接下來我就一個一個把我知道的流程寫下來。 檔案管理 檔案管理真的是基本中的基本。你檔案搞不見的話,那就等於沒拍過,要重拍,所以首先是不能把檔案弄不見。這不是廢話,因為這代表你要去做備份。備份的基本概念很簡單,同一份資料平常就要放在三個不同實體的儲存位置上面,最少最少不得少於兩個。實際上來說,就是攝影機/錄音機的記憶卡一份,然後拍到記憶卡快滿或者告一段落的時候,就把記憶卡的內容複製到兩顆不同的外接碟上面。接下來也不要把記憶卡馬上格式化繼續用,最好是拿別張卡先用。 到後製的時候,也最好是導演/製片這邊自己保留一份,另一份給後製部門這樣。攝影團隊與錄音團隊通常自己也會保留一陣子,以防導演/製片把檔案搞砸。… Read more 基本影片製作的技術流程管理

用 ffmpeg 把影片檔重新封裝

所謂的影片轉檔其實有兩種。一種是把影片檔的肉(內容)解碼後再編碼,一種是把影片檔的肉從皮套(容器)裡面拿出來,重新封裝到另一個皮套裡面。 一般人比較常接觸到軟體都預設把整塊肉再編碼,我也不知道為什麼。再編碼(re-encoding)這個程序通常會造成原本影片的一些資訊流失,尤其是在 H.264 等傳輸用編碼格式之間互轉的時候。再者,解碼跟編碼都是很耗費效能跟時間的事情。如果用 GPU 或 Apple T2 晶片來做硬體編碼的話可能會快一點,但是還是需要不少時間。 其實有些時候,你並不需要再編碼。比如說你下載了一個 MKV 影片檔,但你的 Mac 裡只有 QuickTime 播放器,沒辦法播 MKV 檔。你如果跟我一樣就是想用 QuickTime 放影片的話,那你一定要把它轉成… Read more 用 ffmpeg 把影片檔重新封裝

View Controller 與狀態機

(本文亦發表於 AppCoda TW) 我們常常會碰到一個 View Controller 要處理不同狀態的情況。比如說,它本身就提供了編輯與非編輯狀態。如果資料是從網路 API 抓回來的話,那可能要處理載入與錯誤狀態。如果資料缺乏內容的話,也許還要加上空白狀態。這些狀態每一個在處理的事情可能很簡單,但如果全部都丟給同一個 UIViewController 物件去處理的話,那它一定馬上就成為所謂的 Massive View Controller。除了充滿各式各樣的控制流語句之外,它還得一次控管各式各樣的資料與物件,使得出現 bug 的機率大增。 於是,人們為了解決過於肥大的 View Controller,發明出一個又一個的架構,試圖給各個控制器物件更清楚的職責。然而,常見的幾個架構都是依據職責的性質來分類的。比如說,某個物件負責網路呼叫,某個物件負責導航邏輯,某個物件負責資料與 UI… Read more View Controller 與狀態機