Javacv: Dekodierung von H.264-Live-Streams vom Red5-Server auf einem Android-Gerät
Hier ist mein Problem, ich habe eine serverseitige Anwendung mit Red5 implementiert, die einen H.264-codierten Live-Stream sendet. Auf der Clientseite wird der Stream als Byte empfangen. []
Um es auf der Android-Client-Seite zu dekodieren, habe ich dieJavacv-FFmpeg Bibliothek. Der Code zum Decodieren lautet wie folgt
public Frame decodeVideo(byte[] data,long timestamp){
frame.image = null;
frame.samples = null;
avcodec.av_init_packet(pkt);
BytePointer video_data = new BytePointer(data);
avcodec.AVCodec codec = avcodec.avcodec_find_decoder(codec_id);
video_c = null;
video_c = avcodec.avcodec_alloc_context3(codec);
video_c.width(320);
video_c.height(240);
video_c.pix_fmt(0);
video_c.flags2(video_c.flags2()|avcodec.CODEC_FLAG2_CHUNKS);
avcodec.avcodec_open2(video_c, codec, null))
picture = avcodec.avcodec_alloc_frame()
pkt.data(video_data);
pkt.size(data.length);
int len = avcodec.avcodec_decode_video2(video_c, picture, got_frame, pkt);
if ((len >= 0) && ( got_frame[0] != 0)) {
....
process the decoded frame into **IPLImage of Javacv** and render it with **Imageview** of Android
}
}
Die vom Server empfangenen Daten lauten wie folgt
Einige Bilder mit folgendem Muster
17 01 00 00 00 00 00 00 02 09 10 00 00 00 0F 06 00 01 C0 01 07 09 08 04 9A 00 00 03 00 80 00 00 16 EF 65 88 80 07 00 05 6C 98 90 00...
Viele Bilder mit folgendem Muster
27 01 00 00 00 00 00 00 02 09 30 00 00 00 0C 06 01 07 09 08 05 9A 00 00 03 00 80 00 00 0D 77 41 9A 02 04 15 B5 06 20 E3 11 E2 3C 46 ....
Mit dem H.264-Codec für Decoder gibt Decoder eine Länge> 0 aus, aber got_frames = 0 immer.
Mit dem MPEG1-Codec gibt der Decoder Länge> 0 und got_frames> 0 aus, aber das Ausgabebild ist grün oder verzerrt.
Wenn ich jedoch den FFmpegFrameGrabber-Code von javacv befolge, kann ich die lokalen Dateien (H.264-codiert) mit ähnlichem Code wie oben dekodieren.
Ich frage mich, welche Details ich vermisse, und Header-bezogene Datenmanipulation oder Einstellung Codec für Decoder geeignet.
Jeder Vorschlag, Hilfe geschätzt.
Danke im Voraus.