繁体   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