顯示具有 Multimedia 標籤的文章。 顯示所有文章
顯示具有 Multimedia 標籤的文章。 顯示所有文章

2013年1月9日 星期三

OpenGL ES 2.0 tutorial for iOS 6 and Xcode 4.5.2 ﹣Part 2

在 OpenGL ES 2.0 tutorial for iOS 6 and Xcode 4.5.2 ﹣Part 1 中已經試過了最簡易實現的步驟,接著繼續加入 Shader  的使用。Shader 使用像 C 語言一樣的 GLSL 語言,主要有2種 Shaders,Vertex Shader 和 Fragment Shader,各自有各自的作用。讓我們加入 Shader!

建立一個空白檔案,取名為 SimpleVertex.glsl

2013年1月5日 星期六

OpenGL ES 2.0 tutorial for iOS 6 and Xcode 4.5.2 ﹣Part 1

原本的 tutorial 來自 OpenGL ES 2.0 for iPhone Tutorial,因為在它的實驗裡不是使用 iOS 6 和 Xcode 4.5.2 的版本,所以實際在執行時,遇到了一些問題,導致無法看到正確的結果。就如同我常告訴自己一樣,有不了解的東西時,一定是有觀念不懂,才看不到問題的所在,就像在實驗這個 tutorial 時,從不能執行到最後做出來後,才知道是個簡單的觀念。

實驗開始!參考 OpenGL ES 2.0 for iPhone Tutorial ,首先會遇到找不到 window-based Application 的問題,在 Xcode 4.5.2 已經拿掉,必須改用 Empty Application。

2012年12月10日 星期一

FFmpeg tutorial on Mac OS X - tutorial03

這個 tutorial03 花了我不少時間,而且現在還有 Audio 的問題還沒有解決,因為過程中有很多地方需要注意,所以就先紀錄下來。

在前兩個 tutorials ( FFmpeg tutorial on Mac OS X - tutorial01FFmpeg tutorial on Mac OS X - tutorial02 ) 中,我使用的編譯方式是,在終端機裡以 Configure 和 Make 的方式來進行編譯,需要額外的函式庫就加入它們來使用。但是在 tutorial03 中,卻一直沒辦法用同樣的方式,產生可用的執行檔。這裡說“可用的”是代表我的確已經編譯成功了,但是執行時會發生 crash  的現象,讓我找問題找了很久。

在 tutorial03 的練習中,主要是加入了 Audio,我使用的程式碼在 Linux 平台上已經驗證過(見 FFmpeg tutorial practice - tutorial03 ),也聽得到 Audio 的播放,但是在 Mac OS X 平台上,就是沒有辦法聽到!

2012年12月4日 星期二

FFmpeg tutorial on Mac OS X - tutorial02

練習過 tutorial01 on Mac OS (見 FFmpeg tutorial on Mac OS X - tutorial01) 之後,接著我們繼續來實作 FFmpeg tutorial02 on Mac OS。如果還記得在 Linux 平台的 FFmpeg tutorial02 (見 FFmpeg tutorial practice - tutorial02),它需要加入第三方的函式庫 SDL,同樣地,我們也要準備給 Mac OS 用,所以去下載原始碼,然後編譯吧!編譯完之後,再設定 tutorial02 的 Makefile,就像在 Linux 平台做的事一樣。記得一樣要加入 Mac OS 所需要的函式庫!以下是我用的 Makefile

2012年12月3日 星期一

FFmpeg tutorial on Mac OS X - tutorial01

之前已試過在 Linux 的平台上練習 FFmpeg tutorial (見 FFmpeg tutorial practice - tutorial01),接著我想在 Mac OS X 上也做一樣的事。理論上,需要修改的地方應該不多,只是細節要怎麼處理就需要花一點時間試。當我把程式碼從 Linux 平台上放到 Mac OS 的平台上時,一樣先從 tutorial01 開始;當然,我們需要 Mac 版的 FFmpeg,所以需要在 Mac OS 平台上編譯出它的函式庫來用。我算是 Mac OS 平台上的新手,大約一年多的使用經驗,在 Linux 平台上知道怎麼做的事,到 Mac OS 平台上卻不一定知道怎麼處理。不過沒關係,花點時間找一下就可以了。

首先我遇到的是新增函式庫的問題,我使用的 Linux 平台是 Ubuntu,如果少了某某函式庫,可以用很多方式去安裝新的函式庫,Ubuntu 的軟體中心(Ubuntu Software Center)也做的不錯,可以很容易管理你的軟體安裝結果;但在 Mac OS 平台上,是用不同的方式做的,目前我用的是 MacPorts 來管理,因為在編譯 FFmpeg 時,遇到有缺少函式庫的問題,所以我用了 MacPorts 去新增了需要的函式庫。(MacPorts 的使用方法,在這裡就不說了,利用 Google 可以找到很多的說明。)

2012年11月30日 星期五

如何使用 MP4SetTrackESConfiguration

在使用 MP4v2 製作 .mp4 檔案時,如果你要使用的 Audio 編碼格式是 AAC,那麼你就需要使用 MP4SetTrackESConfiguration 這個函式來設定解碼需要的資料。在網路上看到的例子都是以 FAAC 編碼為居多,大多都可以參考需要的設定,設定 MP4SetTrackESConfiguration 的方式,都是先利用 FAAC 裡的 faacEncGetDecoderSpecificInfo 得到想要的資料,再傳給 MP4SetTrackESConfiguration

像這樣

faacEncGetDecoderSpecificInfo(hEnc, &Config, &ConfigLen);
MP4SetTrackESConfiguration(hFile, AudioTrack, Config, ConfigLen);

這是剛好你用的是 FAAC library,但如果你用的是別的 library 該怎麼辦呢?

2012年11月26日 星期一

MP4v2 - 製作MP4檔案格式

從接觸電腦以來,對於影片的檔案格式的區分,就只有依它的副檔名來判斷,.avi 就說它是 .avi 的影片檔,.rm 就只知道它是用 real player 播放的 .rm 檔案,.mp4 就說它是 .mp4 影片檔。不然,也是只有在用某一種播放器時,知道需要對映什麼樣的副檔名,才能看到影片的內容,像大學時很流行的PowerDVD,要看電影用它就對了,也只知道要去打開 .dat 的檔案才能看到。其它像是編碼格式,H.264、MPEG 、MP3等,那時真的不了解它們的意義是什麼?就算修了多媒體影像的課,對於那時的我來說,都只是見樹不見林的階段,一點都不知道全貌是什麼。一直到了需要自己把影片檔案,從頭到尾生出來之後,才真正了解影像聲音的編碼到底在做什麼,它為什麼一定播放器支援才能播放,為什麼沒有解碼器不能看。

一般我們所說的影片檔案格式,像 .mp4 、.avi 、.mkv 、.wmv...,它們都是“容器”,也就是說,它是用來放影像和聲音的,而影像是用什麼編碼的,或聲音是用什麼編碼的,那就看你怎麼搭配(當然,這是理論上的說法,最主要還是得看規格怎麼定),要符合它們所定的格式,對映的播放器才知道怎麼播。所以,有些播放器不能看,就是這個原因,因為它根本就不了解別的容器的意義。如果只是因為沒有安裝需要的解碼器,那還有機會可以看,只要為它安裝就行了,它和不了解容器規格的原因不同,它只是少了那個解碼器。

2012年11月13日 星期二

RGB to YUV(YCbCr)


比較常用 RGB 來表示顏色,很容易可以找到 RGB 的配色表。但是如果要用 YCbCr 來表示顏色該怎麼辦?本來以為也有類似的顏色表可以找,但是一直沒找到,反而找到的都是公式,如下所示

這是 RGB 轉 YUV 的公式


    Y=R*0.299+G*0.587+B*0.114;
    U=R*-0.169+G*-0.332+B*0.5+128;
    V=R*0.5+G*-0.419+B*0.0813+128;

也有 YUV 轉 RGB 的公式

    R = Y+(1.4075*(V-128));
    G= Y-(0.3455*(U-128)-(V-128)));
    B= Y+(1.779*(U-128));

如果要用,就用 Excel 或是 Google 試算表來計算,還蠻方便的!

2012年11月1日 星期四

FFmpeg tutorial practice - tutorial04

在Tutorial04裡,主要是修改一些 Coding 方式,主要使用不同的 threads 來處理 Video 和 Audio,一方面讓程式架構較模組化,另一方面是為了之後 Video/Audio 同步之用。如果有從 Tutorial01 一直實驗上來,大概要改的東西都在前面講過了,下面就列出,我花了比較久的時間的部份。

有一段程式碼是為了結束程式所要使用的

// will interrupt blocking functions if we quit!
url_set_interrupt_cb(decode_interrupt_cb);

int decode_interrupt_cb(void) {
    return (global_video_state && global_video_state->quit);
}

但是因為 url_set_interrupt_cb 在 FFmpeg-1.0 中已經不再使用了,所以要改成下面的方式

int decode_interrupt_cb(void *ctx) {
    return (global_video_state && global_video_state->quit);
}

static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };

pFormatCtx->interrupt_callback = int_cb;

2012年10月28日 星期日

FFmpeg tutorial practice - tutorial03

能夠把Video顯示在螢幕上之後,接著繼續加入Audio,也就是 Tutorial03 的目的。(如果還沒試過 Tutorial01,請先從 FFmpeg tutorial practice - tutorial01 開始練習) 播放Audio,一樣是借用SDL(Simple DirectMedia Layer),讓你能聽到聲音。主要的概念是從檔案中讀取 Audio stream 之後,把每一個 Audio 的 Packet 掫取出來 decode,把 decode 完成的資料傳給 SDL 去做播放的動作。其中,要注意 Audio 格式能不能被 decode,也就是你使用的 FFmpeg 的 libraries 是否支援你所要用的格式,如果不支援,那一定聽不到正確的聲音的。

FFmpeg tutorial practice - tutorial02

試過了 FFmpeg tutorial practice - tutorial01 之後,接著繼續 tutorial02。Tutorial02主要是要讓 Video 能顯示在螢幕上,而 Tutorial01只是讓畫面先存起來。為了能顯示在螢幕上,必須先研究一個新的東西,叫做SDL(Simple DirectMedia Layer),它是跨平台的函式庫,主要用來處理一些低層的操作,像聲音、鍵盤、滑鼠、OpenGL 3D硬體、2D video buffer等。我也是第一次接觸這個東西,不過,如果你學會如何使用第三方的函式庫的能力之後,只要有好的文件及 Sample Code,要了解是不會太難的。

2012年10月22日 星期一

FFmpeg tutorial practice - tutorial01

FFmpeg 是很有名的 Open source software,它提供了很強大的 Libraries 可以讓你使用,如果你對內部的程式有興趣的話,還可以下載它的原始碼來仔細看看。FFmpeg 網站的文件其實還算不少,但是要能讓你有個入門的說明,真的要花時間好好研究。我在其中找到了較入門且詳細的說明文件,但是它一開始就表明了文件已經過時了,一些原本在 Sample code 裡的程式碼所用的 API 可能都已經不再使用,所以要參考的人注意。也因為這樣,自己就花了一些時間,試著重新建構 Sample code,讓它可以正常編譯且運作。 

原始的說明網站在這裡,有興趣的同好也可以去看看。它提供了8個 tutorial examples,這裡是第一個,也就是 tutorial01。如果一開始直接拿過來編譯,會出現警告和錯誤,這裡就是把這些問題解決的過程。