2016-08-09 97 views
1

我有一個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?

回答

1

你是什麼意思? 如果我理解正確 - 你有: vlc(客戶端)---- rtmp協議----安卓(生產商) 您使用MediaCodec對某些視頻(可能是攝像頭)進行編碼,並且在vlc中存在時間延遲?對?

起初 - 你在用什麼 - 直接輸入緩衝區或MediaCodec.Callback()? 在回調 - 你可以檢查onOutputBufferAvailable中的每一幀,並計算從一幀到另一幀的時間 - 這會告訴你 - 這是在Android端的問題。

然後你就可以嘗試解決框架transef問題

  1. 您可以使用Wireshark來確定幀的發送時間和赤 - 可能這是網絡問題
  2. 比 - VLC等球員試圖填補一些內部緩衝區,只有在這個開始顯示視頻後。嘗試開啓vlc緩衝區(https://forum.videolan.org/viewtopic.php?t=40408)。然後 - 常見的是vlc等待IDR幀。您可以在代碼中設置發送IDR幀的時間間隔

    format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL,iframeInterval); iframeInterval以秒(嘗試設置1秒) (這將增加流大小)

對不起我的英文不好

0

您可以希望產生以恆定速率的視頻幀,甚至超過20個FPS以可接受的延遲產生流暢的視頻。 h264編碼器將會優雅地處理穩定的圖像(一次約30秒內變換一次),並且當沒有變化時,幀尺寸將最小化。