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

2013年6月12日 星期三

FFmpeg 系列

FFmpeg 是著名的 Open source,主要用來處理影像和聲音,很值得研究及學習。為了方便查詢,在這裡整理了相關的文章。


在 Linux 平台上的實驗

FFmpeg tutorial practice - tutorial01
FFmpeg tutorial practice - tutorial02
FFmpeg tutorial practice - tutorial03
FFmpeg tutorial practice - tutorial04

在 Mac OS X 平台上的實驗

FFmpeg tutorial on Mac OS X - tutorial01
FFmpeg tutorial on Mac OS X - tutorial02
FFmpeg tutorial on Mac OS X - tutorial03

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月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。如果一開始直接拿過來編譯,會出現警告和錯誤,這裡就是把這些問題解決的過程。