2013-03-30 17 views
4

我有一個有趣的問題,我需要研究與非常低級別的視頻流相關的問題。將原始數據轉換爲適用於iOS的可顯示視頻

有沒有人有任何經驗轉換成一個低分辨率視頻流的原始字節流(分成每個像素信息,但不是標準格式的視頻)?我相信我可以將數據映射爲每像素字節的RGB值,因爲與原始數據中的值對應的顏色值將由我們確定。我不知道該從哪裏出發,或者每個像素需要RGB格式。

我看過FFMPeg,但它的文檔很龐大,我不知道從哪裏開始。

我所包含的具體問題是否可以用該像素數據創建CVPixelBuffer?如果我這樣做,我需要將每像素數據的格式轉換爲什麼格式?

此外,我是否應該更深入地研究OpenGL,如果是的話,哪裏可以找到關於此主題的信息?

CGBitmapContextCreate呢?例如,如果我去了,我去了this,典型的像素字節需要看起來像什麼?這是否足夠快以保持幀率高於20fps?

編輯

我想與你兩個優秀的幫助,並以我個人的一些更多的研究,我已經把如何構建原始RGBA數據,然後構建一個CGImage計劃從這些數據開始,從這個CVPixelBuffer from CGImage的CGImage中創建一個CVPixelBuffer。

但是,要在數據進入時播放那些數據,我不確定我會看到什麼樣的FPS。我將它們繪製到CALayer,還是有一些類似於AVAssetWriter的類,我可以在添加CVPixelBuffers時使用它來播放它。我擁有的經驗是使用AVAssetWriter將構建的CoreAnimation層次結構導出到視頻,因此視頻總是在開始播放之前構建的,而不是作爲實時視頻顯示。

+2

有一個deeeeeeeeep看AVFoundation,尤其是AVAssetWriter。閱讀完該文檔後,一個好的起點可能是「[如何將UIImage數組導出爲電影](http://stackoverflow.com/questions/3741323/how-do-i-export-uiimage-array-as -a-電影/ 3742212)」。 – Till

+0

我已經使用AVAssetWriter完成了相當多的工作,但是目前的問題是我不知道如何構建原始像素數據。 –

+1

確實是這個問題。您必須弄清楚如何使用您從流中接收的原始數據構建像素緩衝區。這將取決於傳入數據的格式,編碼等。一旦你有了,請檢查@Till推薦的推薦和AVAssetWritter。這可能有幫助 CVPixelBufferRef buffer =(CVPixelBufferRef)[self pixelBufferFromCGImage:theImage size:CGSizeMake(image.size.width,image.size.height)]; if(buffer) if(![adapter appendPixelBuffer:buffer withPresentationTime:CMTimeMake(frame,fps)]){ –

回答

5

我這樣做過,我知道,你發現我的GPUImage項目前一陣。當我回答那裏的問題時,GPUImageRawDataInput就是你想要的,因爲它可以快速上傳RGBA,BGRA或RGB數據目錄實際上成爲OpenGL ES紋理。從那裏,幀數據可以被過濾,顯示在屏幕上,或記錄到電影文件中。

根據我的個人經驗,您提出的將CGImage傳遞給CVPixelBuffer的路徑不會產生非常好的性能。在通過Core Graphics實時視頻時,開銷太大。您希望直接進入OpenGL ES,以獲得最快的顯示速度。

我甚至可以改進我的代碼,使它比現在更快。我目前使用glTexImage2D()來更新本地字節的紋理數據,但使用iOS 5.0中引入的紋理緩存可能會更快速地在保持其大小的紋理內加速刷新數據。在設置緩存時會有一些開銷,使它們對於一次性上傳速度稍慢一些,但快速更新數據的速度應該更快。

+0

甚至不能告訴你我多麼感激你的幫助。我在那邊回答,但爲了防止其他人來找我,我只是想確保我正確理解課程。我猜我在GPUImageRawDataInput上每幀調用uploadBytes?從那裏我添加我用作RawDataInput的目標的GPUImageFilter,然後添加GPUImageView作爲我使用的過濾器的目標?如果我想跳過過濾器,那麼我可以將RawDataInput添加爲GPUImageView的目標,或者我會以某種方式使用RawDataOutput? –

+1

@MattFoley - 是的,你需要使用'-uploadBytes:',每一個新的框架都進來了。你還需要用'-processData'來跟着它,讓它沿着管道的其餘部分傳播一次上傳。如果顯示器是你所關心的,你可以直接從原始數據輸入到GPUImageView。 –

+0

嗨布拉德,一年後,我仍然在空閒時間在這個軟件上工作。你提到,如果顯示器是我所需要調用的「processData:」,那麼重要。我很高興地說,我們已經播放了相當長一段時間的原始數據,但是目前我正在將GPUImageMovieWriter與您幫助我的GPUImageRawDataInput集成在一起,並在AVAssetWriter上運行時處於「12902」狀態開始錄製。這是我的代碼:http://pastebin.com/LD6ZcJtN是否需要額外的步驟我缺少?感謝Brad的一切! –

1

我的2美分:

我做了一個OpenGL遊戲,讓用戶記錄中的3D場景。播放經重放的場景(而不是播放視頻,因爲實時編碼,並沒有產生舒適的FPS做

有一種技術,它可以幫幫忙,可惜我沒有時間去實現它。 http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/

這種技術應該減少時間越來越像素從openGL的回來。你可能會得到一個可接受的視頻編碼率。