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