2017-02-03 6 views
1

원격 데스크톱 응용 프로그램에서 작업 중이므로 인코딩을 위해 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를 통해 패킷을 보내고 클라이언트에서 디코딩 할 계획입니다. 어떤 도움이라도 대단히 감사하겠습니다.

+0

사용을 내가 텍스트 바이너리 파일로 작성하고, 나는 매우 간단하지만 중요한 실수를했다, 나는 그것이 처음부터 작업을 얻었다 밝혀, 그래서 ... x264 직접 (ffmpeg가 어쨌든 사용하기를 원합니다). 'nalu_process' 콜백을 사용하고'intra refresh '를 사용하십시오. – szatmary

답변

0

webrtc의 소스 코드를 살펴볼 수 있습니다. openh264 및 ffmpeg를 사용하여 작업을 완료하십시오.

나는 그것에 대해 잠시 공부하고 있었다. 하지만 현재 최신 소스 코드를 사용할 수는 없습니다.

찾았습니다. source code입니다.

희망이 있습니다.

-1

피드백을 주셔서 감사합니다 여러분의 도움