원격 데스크톱 응용 프로그램에서 작업 중이므로 인코딩을 위해 ffmpeg를 사용하여 TCP를 통해 인코딩 된 H264 패킷을 보내고 싶습니다. 그러나 (YUV444에 이미) 하나의 프레임을 인코딩 특별한 경우에 대한 유용한 정보를 찾을 수 없습니다 및 패킷을 얻을.ffmpeg H264 네트워크 스트리밍을 위해 프레임을 한 번에 인코딩합니다.
나는 몇 가지 문제를 가지고, 첫 번째였습니다 :
avcodec_encode_video2
차단 아니었다 , 나는 발견이 진짜이기 때문에 당신은, 그러나, 마지막에 프레임을 "지연"GET 대부분의 시간
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 프레임"을 설정하는 방법? 그리고, 그것은 "한 번에 하나씩"인코딩에 최적일까요? 또한 나는 품질에 대해 지금 염려하지 않고 단지 (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);
}
, 패킷이 올바른 경우 RAW 파일을 재생하고, 그 내 주요 문제의 ffplay. TCP를 통해 패킷을 보내고 클라이언트에서 디코딩 할 계획입니다. 어떤 도움이라도 대단히 감사하겠습니다.
사용을 내가 텍스트 바이너리 파일로 작성하고, 나는 매우 간단하지만 중요한 실수를했다, 나는 그것이 처음부터 작업을 얻었다 밝혀, 그래서 ... x264 직접 (ffmpeg가 어쨌든 사용하기를 원합니다). 'nalu_process' 콜백을 사용하고'intra refresh '를 사용하십시오. – szatmary