1 嘗試了下CCamera ,開啟之後,調用PrepareVideoCaptureL,然後StartVideoCapture。
得到的資料時yuv格式的
/** 4:2:0 format, 8 bits per sample, Y00Y01Y10Y11UV. */
EFormatYUV420Interleaved = 0x0400,
/** 4:2:0 format, 8 bits per sample, Y00Y01Y02Y03...U0...V0... */
EFormatYUV420Planar = 0x0800,
/** 4:2:2 format, 8 bits per sample, UY0VY1. */
EFormatYUV422 = 0x1000,
/** 4:2:2 format, 8 bits per sample, Y1VY0U. */
EFormatYUV422Reversed = 0x2000,
/** 4:4:4 format, 8 bits per sample, Y00U00V00 Y01U01V01... */
EFormatYUV444 = 0x4000,
/** 4:2:0 format, 8 bits per sample, Y00Y01Y02Y03...U0V0... */
EFormatYUV420SemiPlanar = 0x8000,
用YUV Player 是可以播放的,但是是沒有音訊。檔案也特別的大。
但是可以採集映像。
參考
RGB與YUV的轉換
從S60第三版FP2開始,MDF DevVideoRecord API作為SDK API Plug-in的一部分出現了。DevVideoRecord允許對視頻解碼和預先處理進行直接和底層的訪問。
傳輸到解碼器的必須是特殊的顏色格式,YUV422或更常見的YUV420(planar),YUV420每個像素有8位luminance (Y),和減少數量的chrominance(U,V)採樣,每個都覆蓋一個2x2像素地區。在plane模式下,Y,U和V值在記憶體中被分組為[Y0Y1Y2Y3Y4Y5Y6Y7....U0U1....V0V1],這樣增強了圖片的壓縮率.
下列代碼示範了如何將一幀原始RGB(8 bits/channel)轉化為YUV420格式。
// Definitions that help access each colour component in source bitmap
#define sR ((TInt32)(s[2]))
#define sG ((TInt32)(s[1]))
#define sB ((TInt32)(s[0]))
#define KImageWidth 176 // QCIF resolution
#define KImageHeigth 144
const TInt KImageNumPixels = KImageWidth * KImageHeigth;
// Lock source bitmap (CFbsBitmap)
iSourceBitmap->LockHeap(EFalse);
TUint8* s = (TUint8*)iSourceBitmap->DataAddress();
TInt i = 0;
TInt ui = KImageNumPixels;
TInt vi = KImageNumPixels + KImageNumPixels/4;
// iYuv is an array of TUint8 values, length (KImageNumPixels*3/2)
for(TInt j=0; j < KImageHeigth; j++)
for(TInt k=0; k < KImageWidth; k++)
{
// Y value is generated for each pixel
iYuv[i] = (TUint8)( ( 66*sR + 129*sG + 25*sB + 128) >> 8 ) + 16;
// U, V values are generated for every other pixel on every other scanline
if(0 == j%2 && 0 == k%2)
{
iYuv[ui++] = (TUint8)( (-38*sR - 74*sG + 112*sB + 128) >> 8 ) + 128;
iYuv[vi++] = (TUint8)( (112*sR - 94*sG - 18*sB + 128) >> 8 ) + 128;
}
i++;
s+=iBytesPerPixel; // Number of bytes representing one pixel in source
// bitmap e.g. if bitmap display mode == EColor16M
// (24bits/pixel), then iBytesPerPixel == 3
}
iSourceBitmap->UnlockHeap(EFalse);
// iYuv now contains the source frame converted to YUV420p format
注意:最新S60裝置有多個DevVideoRecord解碼用來區分H263和MPEG-4(VSP)編碼能力,是硬體加速還是基於軟體的編碼。一些編碼也支援直接從相機捕捉。編碼器及能力以及支援的輸入格式可以通過編程列出,並選擇一個適當的編碼器。
http://local.wasp.uwa.edu.au/~pbourke/dataformats/yuv/
2 後來用CVideoRecorderUtility。在諾基亞有例子。
但是還有一個問題:OpenFileL(), OpenFileL(), OpenUrlL(), 這三個函數只有OpenFileL()能用,也就是錄製的視頻資料只能儲存在檔案中。而想即時傳送還有待解決。
1. S60用多媒體架構(MMF)實現視頻和音訊回放和錄製,其擁有一個外掛程式架構,可使用多種類型的用於媒體回放和錄製的外掛程式,比如RealPlayer引擎是針對MMF控制器的外掛程式,可使用視訊和音頻回放及流。2. s60內建播放器採用Realplayer引擎。 不支援HTTP流媒體,因為在顯示之前必須把所有的視頻資料一次性讀入緩衝。3. S60的常用格式是 MP4(編解碼標準為H.263和MPEG4)、3GP(H.263和MPEG4)
4.
S60平台支援C++進行多媒體開發,下表總結了如何用C++實現多媒體應用
| 用例 |
Symbian C++ |
| 使用S60媒體播放器和RealPlayer引擎播放本地檔案和RTSP流。 |
使用AppArc API(RApaLsSession)啟動S60媒體播放器應用。 |
| 使用定製的使用者介面和RealPlayer引擎播放本地檔案和RTSP流。 |
建立自己的使用者介面並使用CVideoPlayerUtility API播放和控制檔案或URL。 |
| 使用自己的播放器播放本地檔案。 |
建立自己的播放器。使用CMdaAudioOutputStream進行音頻渲染(1),使用CDirectScreenAccess API 進行視頻渲染。 |
| 使用自己的播放器實施流視頻內容。 |
使用network APIs( RSocketServ、RConnection、RSocket) 串連到網路(2)。 然後使用CMdaAudioOutputStream進行音頻渲染,使用CDirectScreenAccess API 進行視頻渲染。 |
5. 從上表得出結論,CVideoPlayerUtility用來開發視訊剪輯的播放和錄製。如果要開發一個讀取本地檔案或RTSP流而且格式為MP4、3GP或Rmvb的播放器,使用CVideoPlayerUtility就夠了。 但如果需要讀取網路資料流,就必須用network APIs串連到網路擷取資料,接著用CDirectScreenAccess API繪製螢幕,當中主要步驟有RTP傳輸,mpeg4/h264解碼,yuv2rgb轉換。如果不用symbian的API,流媒體傳輸可移植live555,視音頻解碼可用ffmpeg。
本文出自
51CTO.COM技術部落格