開發者需在 Android 上播放伺服器推送的原始幀數據,專案時程緊迫,希望獲得可落地的技術路線與開源庫推薦。
MediaCodec (API 16+) 進行硬體解碼,將 H.264/H.265 幀數據解碼為 YUV 畫面。SurfaceView 或 TextureView 顯示解碼後的畫面;SurfaceView 適合全螢幕播放,效能較佳。ArrayBlockingQueue),網路執行緒寫入,解碼執行緒讀取,平滑抖動。MediaSource,可直接餵入幀數據,文檔完善、維護活躍。// 1. 建立 SurfaceView 與 Holder
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override public void surfaceCreated(SurfaceHolder holder) {
// 2. 啟動解碼執行緒,傳入 holder.getSurface()
new DecodeThread(holder.getSurface()).start();
}
// ...
});
// 3. 解碼執行緒邏輯
class DecodeThread extends Thread {
private final Surface surface;
private MediaCodec codec;
DecodeThread(Surface s) { surface = s; }
@Override public void run() {
codec = MediaCodec.createDecoderByType("video/avc");
codec.configure(format, surface, null, 0);
codec.start();
while (!isInterrupted()) {
int idx = codec.dequeueInputBuffer(10000);
if (idx >= 0) {
ByteBuffer buf = codec.getInputBuffer(idx);
buf.put(fetchFrameFromNetwork()); // 從隊列取幀
codec.queueInputBuffer(idx, 0, buf.position(), pts, 0);
}
// 處理輸出緩衝區...
}
}
}
codec.stop() → codec.release() → surface.release()。若專案允許引入成熟播放器,首選 ExoPlayer 自定義 DataSource;若須自研,參考上述 MediaCodec + SurfaceView 架構,分模組實作網路、緩衝、解碼、渲染四層,單元測試逐層驗證,可在緊湊時程內交付穩定播放功能。