我有一個android平臺rtmp流式傳輸到客戶端應用程序的問題。我的解決方案有很大的延遲,因爲我的表面不會產生每秒60次的幀,它可以隨時產生(例如30秒內)。所以我想立即向客戶展示每個新生成的框架。Android平臺流式視頻
Android正在推動每一幀,它看起來很好。客戶端應用程序(jwplayer或vlc)收到它,但它正在等待一些東西。只有在收到多個幀後纔會顯示視頻。但是當我剛剛收到客戶端時,我需要看到每個傳入幀。
它是如何工作的: 我有一個Surface對象,從MediaCodec類獲得。 MediaCodec設置爲h264視頻編碼。
MediaCodec mEncoder;
.....
MediaFormat format = MediaFormat.createVideoFormat("video/avc", width, height);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
format.setInteger(MediaFormat.KEY_BIT_RATE, videoBitrate);
format.setInteger(MediaFormat.KEY_FRAME_RATE, videoFramePerSecond);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iframeInterval);
try {
mEncoder = MediaCodec.createEncoderByType("video/avc");
} catch (IOException e) {
e.printStackTrace();
}
mEncoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
mSurface = mEncoder.createInputSurface();
if (mSurfaceCallback!=null)
mSurfaceCallback.onSurfaceCreated(mSurface);
mEncoder.start();
有時候android會畫到表面。我無法控制這幅圖畫的速度。另外,我無法在這個表面上畫任何東西。當表面上的東西發生變化時,MediaCodec正在用h264幀生成新的byteBuffer。我通過rtmp發送這個幀。
在一個客戶端我有jwplayer
<pre id="myElement"></pre>
<script>
var playerInstance = jwplayer("myElement");
playerInstance.setup({
file:"rtmp://127.0.0.1:1935/live/stream",
height: 800,
width: 480,
autostart: true,
controls: false,
rtmp: {
bufferlength: 0.1
}
});
</script>
我試圖改變iframeInterval,編碼的FPS html頁面,BufferLength中..沒有什麼是真正有用的。
是否有任何可能性顯示輸入幀immeditely?