2017-02-03 3 views
1

Ich arbeite an einer Remote-Desktop-Anwendung, ich möchte ein codiertes H264-Paket über TCP senden, indem ich ffmpeg für die Codierung verwende. Jedoch konnte ich keine nützlichen Informationen für den speziellen Fall der Kodierung nur eines Rahmens (bereits auf YUV444) finden und das Paket erhalten.ffmpeg H264 Frame für Netzwerkstreaming gleichzeitig codieren

Ich habe einige Probleme, war die erste, die:

avcodec_encode_video2 

nicht versperrte, fand ich, dass die meisten der Zeit, die Sie die „verzögerte“ Frames am Ende bekommen, aber da dies ein real Zeit, um die Lösung Streaming war:

av_opt_set(mCodecContext->priv_data, "tune", "zerolatency", 0); 

Jetzt habe ich den Rahmen, aber einige Probleme, dauert es eine Weile, und noch schlimmer bekam ich eine grau mit Müll Pixel Video Ergebnis. Meine Konfiguration für den Codec Kontext:

m_pCodecCtx->bit_rate=8000000; 
m_pCodecCtx->codec_id=AV_CODEC_ID_H264; 
m_pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO; 
m_pCodecCtx->width=1920; 
m_pCodecCtx->height=1080; 
m_pCodecCtx->pix_fmt=AV_PIX_FMT_YUV444P; 
m_pCodecCtx->time_base.num = 1; 
m_pCodecCtx->time_base.den = 25; 
m_pCodecCtx->gop_size = 1; 
m_pCodecCtx->keyint_min = 1; 
m_pCodecCtx->i_quant_factor = float(0.71); 
m_pCodecCtx->b_frame_strategy = 20; 
m_pCodecCtx->qcompress = (float)0.6; 
m_pCodecCtx->qmax = 51; 
m_pCodecCtx->qmin = 20; 
m_pCodecCtx->max_qdiff = 4; 
m_pCodecCtx->refs = 4; 
m_pCodecCtx->max_b_frames = 1; 
m_pCodecCtx->thread_count = 1; 

Ich mag würde wissen, wie dies geschehen könnte, wie kann ich die „I Frames“ eingestellt? und das wäre das Optimum für eine Kodierung "einzeln"? Auch bin ich momentan nicht um die Qualität besorgt, sondern muss einfach schnell genug sein (unter 16 ms).

Für den kodierenden Teil:

nres = avcodec_encode_video2(m_pCodecCtx,&packet,m_pFrame,&framefinished); 

if(nres<0){ 
    qDebug() << "error encoding: " << nres << endl; 
} 

if(framefinished){ 
    m_pFrame->pts++; 
    ofstream vidout("video.h264",ios::app); 
    if(vidout.good()){ 
     vidout.write((const char*)&packet.data[0],packet.size); 
    } 
    vidout.close(); 

    av_packet_unref(&packet); 

} 

ich einen Container nicht verwenden, nur eine RAW-Datei, ffplay Raw-Dateien wiedergeben, wenn die Pakete richtig sind, und das ist mein Hauptpunkt. Ich plane, das Paket über TCP zu senden und auf dem Client zu dekodieren. Jede Hilfe würde sehr geschätzt werden.

+0

Verwendung x264 direkt (das will ffmpeg sowieso verwenden). Verwenden Sie den 'nalu_process' Callback und benutzen' intra refresh' – szatmary

Antwort

0

Sie können sich den Quellcode von webrtc ansehen. Verwenden Sie Openh264 und ffmpeg, um Ihre Arbeit zu erledigen.

Ich war für eine Weile darin studieren. Aber ich kann momentan nicht den aktuellsten Quellcode.

Ich fand dies: source code.

Ich hoffe, es hilft.

-1

Stellt sich heraus, ich habe es seit Anfang arbeiten, ich habe sehr einfache, aber wichtige Fehler, ich war als Text eine Binärdatei zu schreiben, so ...

Danke für das Feedback und Ihre Hilfe

Verwandte Themen