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 平台上,就是沒有辦法聽到!



首先是在 Mac OS X 平台上編譯 SDL 的問題,因為在 FFmpeg tutorial on Mac OS X - tutorial02 已經編譯過一次,而且可以正常的播放影片,所以很直覺地認為 SDL 函式庫是沒有問題的。但是後來發現在編譯的時候,其實有出現下面的訊息:

/usr/bin/ranlib: file: build/.libs/libSDL.a(SDL_audiodev.o) has no symbols
/usr/bin/ranlib: file: build/.libs/libSDL.a(SDL_mixer_MMX.o) has no symbols
/usr/bin/ranlib: file: build/.libs/libSDL.a(SDL_mixer_MMX_VC.o) has no symbols
/usr/bin/ranlib: file: build/.libs/libSDL.a(SDL_mixer_m68k.o) has no symbols
/usr/bin/ranlib: file: build/.libs/libSDL.a(SDL_getenv.o) has no symbols
/usr/bin/ranlib: file: build/.libs/libSDL.a(SDL_malloc.o) has no symbols
/usr/bin/ranlib: file: build/.libs/libSDL.a(SDL_qsort.o) has no symbols
/usr/bin/ranlib: file: build/.libs/libSDL.a(SDL_stdlib.o) has no symbols
/usr/bin/ranlib: file: build/.libs/libSDL.a(SDL_yuv_mmx.o) has no symbols
/usr/bin/ranlib: file: build/.libs/libSDL.a(SDL_nullmouse.o) has no symbols
/usr/bin/ranlib: file: build/.libs/libSDL.a(SDL_dgamouse.o) has no symbols
libtool: link: ranlib build/.libs/libSDL.a
ranlib: file: build/.libs/libSDL.a(SDL_audiodev.o) has no symbols
ranlib: file: build/.libs/libSDL.a(SDL_mixer_MMX.o) has no symbols
ranlib: file: build/.libs/libSDL.a(SDL_mixer_MMX_VC.o) has no symbols
ranlib: file: build/.libs/libSDL.a(SDL_mixer_m68k.o) has no symbols
ranlib: file: build/.libs/libSDL.a(SDL_getenv.o) has no symbols
ranlib: file: build/.libs/libSDL.a(SDL_malloc.o) has no symbols
ranlib: file: build/.libs/libSDL.a(SDL_qsort.o) has no symbols
ranlib: file: build/.libs/libSDL.a(SDL_stdlib.o) has no symbols
ranlib: file: build/.libs/libSDL.a(SDL_yuv_mmx.o) has no symbols
ranlib: file: build/.libs/libSDL.a(SDL_nullmouse.o) has no symbols
ranlib: file: build/.libs/libSDL.a(SDL_dgamouse.o) has no symbols


很剛好的,這幾個都是有關 Audio 有關檔案,讓我針對這些訊息查了很久;不過,令我感到無奈的是,這似乎不是影響程式播放的真正原因。

在我無計可施之間,我曾試著用 Xcode 把 SDL 重新編譯一次,並做出動態函式庫;我也曾試著改用 Xcode 來編譯 tutorial03.c 檔案,這是為了想利用別的函式庫來處理 Audio。但也因為這樣意外發現了程式的小問題,而直接利用終端機編譯卻沒能找到,因為利用終端機是直接 crash 掉,而使用 Xcode 卻告訴了我不一樣的事。

主要是 audio_decode_frame 這個函式內的問題


int audio_decode_frame(AVCodecContext *aCodecCtx, uint8_t *audio_buf, int buf_size) {

    AVPacket avpkt;


    memset(&avpkt, 0, sizeof(avpkt));
    for(;;) {


}

紅色的部份,我在 Linux 平台上是沒有加的,但是在 Mac OS X 平台上卻要加入這一行!目前我的猜測是和編譯器有關,導致這樣的結果。

Update:

就在發表文章的同時,終於讓 Audio 可以正常的運作了。但是是在 Xcode 上編譯的才可以,使用終端機編譯的還是有問題!

Xcode Demo
tutorial03 雖然加入了 Audio,但是還沒有處理 A/V Sync 的問題。



沒有留言:

張貼留言