Ich habe ein Problem mit RTMP Streaming von Android-Oberfläche zu einer Client-Anwendung. Meine Lösung hat eine sehr große Latenz, weil meine Oberfläche keine Frames 60 Mal pro Sekunde produziert, sondern sie jederzeit (in 30 Sekunden zum Beispiel) produzieren kann. Ich möchte also jeden neu produzierten Frame sofort dem Kunden zeigen.Streaming-Video von Android-Oberfläche
Android drückt jeden Frame, es sieht gut aus. Client-App (jwplayer oder vlc) empfängt es, aber es wartet auf etwas. Es zeigt Video nur nach dem Empfang einer Anzahl von Frames. Aber ich muss jeden eingehenden Frame auf der Client-Seite sehen, wenn er gerade empfangen wurde.
Wie es jetzt funktioniert: Ich habe ein Surface Objekt, erhalten von MediaCodec Klasse. MediaCodec ist für h264-Videokodierung eingestellt.
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();
Manchmal Android ist an die Oberfläche. Ich kann die Geschwindigkeit dieser Zeichnungen nicht kontrollieren. Ich kann auch nichts auf diese Oberfläche malen. Wenn sich etwas an der Oberfläche ändert, erzeugt MediaCodec einen neuen byteBuffer mit h264-Rahmen. Ich sende diesen Rahmen von rtmp.
Auf einer Client-Seite habe ich HTML-Seite mit 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>
Ich habe versucht iframeInterval, fps die Codierung zu ändern, bufferLength .. Nichts ist wirklich hilfreich.
Gibt es irgendeine Möglichkeit, ankommende Frames sofort anzuzeigen?