2016-08-09 78 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秒内变换一次),并且当没有变化时,帧尺寸将最小化。