2017-02-03 35 views
1

Я работаю над удаленным настольным приложением, я хотел бы отправить закодированный пакет H264 через TCP с помощью ffmpeg для кодирования. Однако я не смог найти полезную информацию для конкретного случая кодирования только одного кадра (уже на YUV444) и получить пакет.ffmpeg H264 Кодировка кадра за время потоковой передачи сети

У меня есть несколько вопросов, первый был таков:

avcodec_encode_video2 

не блокировал, я обнаружил, что большую часть времени вы получите «замедленной» кадры в конце концов, однако, так как это реальная времени потоковое решение было:

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

Теперь я получил кадр, но несколько вопросов, это займет некоторое время, и даже хуже, я получил серый с мусором пикселями видео в качестве результата. Моя конфигурация для контекста Codec:

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; 

Я хотел бы знать, как это может быть сделано, как я установил «Frames 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); 

} 

Я не использую контейнер, только необработанный файл, ffplay воспроизводить исходные файлы, если пакеты прав, и это мой главный вопрос. Я планирую отправить пакет через tcp и декодировать его на клиенте. Любая помощь будет принята с благодарностью.

+0

использования x264 напрямую (thats want ffmpeg использует в любом случае). Используйте обратный вызов 'nalu_process' и используйте' internal refresh' – szatmary

ответ

0

Вы можете ознакомиться с исходным кодом webrtc. Он использует openh264 и ffmpeg для выполнения вашей работы.

Я изучал его некоторое время. Но я не могу использовать последний исходный код.

Я нашел это: source code.

Надеюсь, это поможет.

-1

Оказывается, я получил это работает с самого начала, я сделал очень простую, но важную ошибку, я пишу в виде текста в двоичный файл, так что ...

Спасибо за обратную связь и ваша помощь

 Смежные вопросы

  • Нет связанных вопросов^_^