7

環境:

的Nexus 7果凍豆4.1.2編輯的Android VideoView幀

問題:

我試圖做一個運動檢測應用程序,使用VideoView與RTSP工作。

我希望有類似的onNewFrameListener

videoView.onNewFrame(Frame frame) 

我試圖讓您能夠通過VideoView的RTSP流的原始幀,但無法找到在Android SDK的任何支持。

我發現VideoView封裝了Android的MediaPlayer類。

所以我潛入media_jni庫試圖找到一種方法來訪問原始幀,但找不到字節緩衝區或任何代表一個幀。

問:

任何人有一個想法在哪裏,我怎麼能找到這個緩衝區,並得到這些數據?

或任何其他的想法,通過VideoView實現運動檢測?

即使是我需要重新編譯AOSP。

+0

您的應用程序只在Android 4.1及更高版本上運行? – yorkw

+0

是的,但如果我需要更早的版本,我也可以管理它。 – Danpe

回答

1

在你的情況下,如果你正在使用實時動作而不是錄製的視頻,我會使用Camera Preview代替VideoView。您可以使用相機預覽回叫捕捉相機捕捉的每個幀。此回調實現:

onPreviewFrame(byte[] data, Camera camera) 
Called as preview frames are displayed. 

我認爲這可能對您有用。

http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html

告訴如果這是你要搜索的內容。

祝你好運。

+1

我無法使用相機預覽RTSP流,只適用於相機實時捕捉... – Danpe

3

您可以擴展VideoView並覆蓋其draw(Canvas canvas)方法。

  • 將您的位圖設置爲通過draw收到的畫布。
  • 撥打電話super.draw()這將獲取框架繪製到您的位圖。
  • 從位圖訪問幀像素。

    class MotionDetectorVideoView extends VideoView { 
    public Bitmap mFrameBitmap; 
    ... 
        @Override 
        public void draw(Canvas canvas) { 
         // set your own member bitmap to canvas.. 
         canvas.setBitmap(mFrameBitmap); 
         super.draw(canvas); 
         // do whatever you want with mFrameBitmap. It now contains the frame. 
         ... 
         // Allocate `buffer` big enough to hold the whole frame. 
         mFrameBitmap.copyPixelsToBuffer(buffer); 
         ... 
        } 
    } 
    

我不知道這會不會起作用。在draw避免在繁重的計算,在那裏啓動一個線程。 試試吧,讓我知道..

+0

我怎樣才能獲得繪製畫布的原始像素?在他們的API中找不到任何關於它的東西。 – Danpe

+0

在Bitmap類中有'public void copyPixelsToBuffer(Buffer dst)'。文檔在這裏:http://developer.android.com/reference/android/graphics/Bitmap.html#copyPixelsToBuffer(java.nio.Buffer) – Ronnie

+0

是的,但如何從畫布獲取位圖? – Danpe