經過一段時間的努力手機3G應用流媒體播放器項目終於接近尾聲了。回想整個過程曆經坎坷阿!一共開發了兩個平台的應用,首先是windows mobile平台,相對symbian來說資源多一些,所以先拿它下手阿。
說一下實現思路,剛開始考慮使用directshow,經過驗證沒達到預期目的(水平差阿,不懂directshow),接著研究tcpmp,尋思開發一個rtsp流外掛程式,再加上mpeg4的外掛程式不就行了嗎!一段時間之後發現tcpmp太牛了,沒看懂!(沒注釋、沒文檔),在快要跳樓的時候決定改為比較最原始的實現方式,
步驟如下:
1、讀取網路資料。
2、交給解碼器解碼。
3、轉換格式。
4、顯示繪製。
首先mobile平台有很多wince和開源的東西可以拿過來用,例子有很多不過大多都是播放本地檔案。在這裡有兩個例子初學者可以看看。
賽安軟體工作室提供的一個mpeg4解碼例子很不錯可以研究一下。它用自己的解碼器,可以播放15分鐘,可以為自己所用的是他的寫屏和yuvtorgb等。
另外一個就是使用ffmpeg和sdl的例子,可以參考一下他使用ffmpeg的方法。ffmpeg在mobile平台下的代碼我這有,網上也有!具體下載位置不說了,在google裡搜尋ffmpeg4mobile有很多個下載點。
有了上面兩個例子開始搞自己的東西吧。首先是rtsp讀取網路流,這個東東網上也有,可以直接拿過用,我用的是開源的live55,不過需要移植一下。效率還可以!有了網路資料就要解碼了,解碼模組可以使用ffmpeg,但是效率不高,就考慮使用xvid,xvid這個解碼器效率不錯,並且也是開源的。有了網路資料和解碼器其餘的都是小問題了,解碼器輸出的yuv420,需要把它轉換為rgb。這步轉換網上很多,沒有搜不到,只有想不到啊!最後參考第一個例子的繪製部分就可以搞定!
附圖:
再一個symbian平台,此平台也有例子!網路大大地好,都有例子參考阿!
首先還是是賽安軟體工作室提供的一個mpeg4解碼例子symbian平台,不過不能debug,只能真機跑,遺憾中。不過繪製部分可參考!
另一個例子就是MobiFLV,主要播放flv檔案,採用ffmpeg部分解碼代碼。此例子可以為我所用的是yuv2bgr的轉換。
symbian平台有一個openc外掛程式,安裝之後用c寫的程式很容易移植過來,這個東西不錯哦!
安裝openc外掛程式之後同mobile一樣,首先是rtsp讀取網路流,我用的是簡單rtsp流,不過需要移植一下。效率還可以!有了網路資料就要解碼了,解碼模組可以使用ffmpeg,但是效率不高,就考慮使用xvid,xvid這個解碼器效率不錯,
並且也是開源的。symbian顯示時可以參考MobiFLV,解碼器輸出的yuv420,需要把它轉換為BGR。
附圖:
以上代碼雖說網上都有,但是也有我的汗水啊!Email sizhiguo512·163.com交流
幾個注意點:
1、mobile平台的全屏方式
if(g_fFullScreen)
{
// To get info full screen mode, first hide all of the shell parts.
dwState = (SHFS_HIDETASKBAR | SHFS_HIDESTARTICON | SHFS_HIDESIPBUTTON);
SHFullScreen(GetSafeHwnd(), dwState);
#ifdef POCKETPC2003_UI_MODEL
if(hmenu != NULL)
{
::ShowWindow(hmenu, SW_HIDE);
}
#endif
// Next resize the main window to be the size of the screen.
SetRect(&rc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
MoveWindow(rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, TRUE);
}
else
{
RECT rcMenuBar = {0};
// To get into normal mode, first show all of the shell parts.
dwState = (SHFS_SHOWTASKBAR | SHFS_SHOWSTARTICON);
SHFullScreen(GetSafeHwnd(), dwState);
#ifdef POCKETPC2003_UI_MODEL
if(hmenu != NULL)
{
::ShowWindow(hmenu, SW_SHOW);
}
#endif
// Then resize the main window to be the size of the work area.
SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, FALSE);
#ifdef POCKETPC2003_UI_MODEL
//GetWindowRect(hwnd, &rcMenuBar);
#endif
MoveWindow(rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top-26, TRUE);
}
2、symbian平台的mmp檔案的include部分要添加 /epoc32/include/stdapis
3、symbian平台的mmp檔案添加CAPABILITY NetworkServices
4、symbian平台自簽名:
/Symbian/9.2/S60_3rd_FP1/Epoc32/tools>makekeys -cert -password 密碼 -len 2048 -dname "CN=Test User OU=Development OR=Company CO=FI EM=test@company.com" mykey.key mycert.cer
/Symbian/9.2/S60_3rd_FP1/Epoc32/tools>signsis name.sis name.sisx mycert.cer mykey.key 密碼
原文:http://sizhiguo512.blog.163.com/blog/static/61107489200941210827912/