簡體   English   中英

ffmpeg H264編碼幀一次用於網絡流

[英]ffmpeg H264 Encode Frame at a time for network streaming

我正在開發一個遠程桌面應用程序,我想通過使用ffmpeg進行編碼來通過TCP發送編碼的H264數據包。 但是,對於僅編碼一幀(已在YUV444上)並獲取數據包的特殊情況,我找不到有用的信息。

我有幾個問題,第一個是:

avcodec_encode_video2

沒有阻塞,我發現大多數情況下您會在最后獲得“延遲”幀,但是,由於這是實時流,因此解決方案是:

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

現在我有了畫框,但是有幾個問題,要花一段時間,甚至更糟的是,我得到了帶有垃圾像素視頻的灰色。 我對編解碼器上下文的配置:

 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;

我想知道如何做到,如何設置“ I Frames”? 並且,這對於“一次一個”的編碼而言將是最佳選擇? 另外,我現在不關心質量,只需要足夠快(不到16毫秒)即可。

對於編碼部分:

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);

}

我使用的不是容器,而是原始文件,如果數據包正確,ffplay會復制原始文件,這是我的主要問題。 我打算通過tcp發送數據包並在客戶端上解碼。 任何幫助將不勝感激。

您可以看一下webrtc的源代碼。 它使用openh264和ffmpeg完成您的工作。

我在里面學習了一段時間。 但是我目前無法獲得最新的源代碼。

我發現了這一點: 源代碼

希望能幫助到你。

事實證明,我從一開始就開始工作,我犯了一個非常簡單但重要的錯誤,我以文本形式編寫二進制文件,所以...

感謝您的反饋和幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM