Исправление wolverin, (текущая версия) :
в команде то да, но она просто для сравнительного теста с моим кодом, в котором собсна и проблема с осыпанием и тормозами, просто на небольшом разрешении я четко вижу что ффмпег в отличии от моего кода выдает хорошую картинку без осыпания и тормозов и при этом формат пикселей роли не играет для него
я и в своем коде конечно же могу цветовое пространство менять, НО я так же вижу что на больших разрешения это вызывает проблему, сейчас не помню уже как было с одинаковым входящих и исходящим разрешением, но при уменьшении 1920х1080 до 640х480 время sws_scale занимал как декодирование и кодирование вместе взятое (наврал, раза в 4 медленнее, порядка 250 мс), мне то нужно добиться максимального фпс в узком канале
Дублирую свой код, буду премного благодарен если подскажите чего не хватает в моей процедуре транскодирования, что приводит к осыпанию и тормозам, повторяюсь вся процедура выполняется в среднем за 30мс для разрешения 640х480 без sws_scale
int WriteStream()
{
int rt = 0;
int64_t time_start = av_gettime_relative();
if ((rt = avcodec_send_packet(pInpCdcCtx, pInpPkt)) < 0)
goto ERROR;
do {
rt = avcodec_receive_frame(pInpCdcCtx, pInpFrm);
if (rt == AVERROR_EOF || rt == AVERROR(EAGAIN))
break;
else if (rt < 0)
goto ERROR_FRM;
int64_t time_dec = av_gettime_relative();
if (pSwsCtx) /* it is NOT USED now because it is very slow, WHY??? and pOutFrm = pInpFrm */
{
pOutFrm->pts = pInpFrm->pts;
sws_scale(pSwsCtx,
(const uint8_t * const *) pInpFrm->data, pInpFrm->linesize, 0, pInpCdcCtx->height,
pOutFrm->data, pOutFrm->linesize);
}
else
{
pInpFrm->key_frame = 0;
pInpFrm->pict_type = AV_PICTURE_TYPE_NONE;
}
int64_t time_sws = av_gettime_relative();
if ((rt = avcodec_send_frame(pOutCdcCtx, pOutFrm)) < 0)
goto ERROR_FRM;
do {
rt = avcodec_receive_packet(pOutCdcCtx, pOutPkt);
if (rt == AVERROR_EOF || rt == AVERROR(EAGAIN))
break;
else if (rt < 0)
goto ERROR_PKT;
int64_t time_enc = av_gettime_relative();
fprintf(stdout, "Packet size inp: %d out: %d bytes Time decode: %.2f scale: %.2f encode: %.2f transcode: %.2f ms ...\r",
pInpPkt->size, pOutPkt->size, (time_dec - time_start)/1000.0, (time_sws - time_dec)/1000.0, (time_enc - time_sws)/1000.0, (av_gettime_relative() - time_start)/1000.0);
rt = av_interleaved_write_frame(pOutFmtCtx, pOutPkt);
av_packet_unref(pOutPkt);
} while (rt >= 0);
av_frame_unref(pInpFrm);
} while (rt >= 0);
return 0;
ERROR_PKT:
av_packet_unref(pOutPkt);
ERROR_FRM:
av_frame_unref(pInpFrm);
ERROR:
PrintError("Error transcoding", rt);
return rt;
}
Исходная версия wolverin, :
в команде то да, но она просто для сравнительного теста с моим кодом, в котором собсна и проблема с осыпанием и тормозами, просто на небольшом разрешении я четко вижу что ффмпег в отличии от моего кода выдает хорошую картинку без осыпания и тормозов и при этом формат пикселей роли не играет для него
я и в своем коде конечно же могу цветовое пространство менять, НО я так же вижу что на больших разрешения это вызывает проблему, сейчас не помню уже как было с одинаковым входящих и исходящим разрешением, но при уменьшении 1920х1080 до 640х480 время sws_scale занимал как декодирование и кодирование вместе взятое, мне то нужно добиться максимального фпс в узком канале
Дублирую свой код, буду премного благодарен если подскажите чего не хватает в моей процедуре транскодирования, что приводит к осыпанию и тормозам, повторяюсь вся процедура выполняется в среднем за 30мс для разрешения 640х480 без sws_scale
int WriteStream()
{
int rt = 0;
int64_t time_start = av_gettime_relative();
if ((rt = avcodec_send_packet(pInpCdcCtx, pInpPkt)) < 0)
goto ERROR;
do {
rt = avcodec_receive_frame(pInpCdcCtx, pInpFrm);
if (rt == AVERROR_EOF || rt == AVERROR(EAGAIN))
break;
else if (rt < 0)
goto ERROR_FRM;
int64_t time_dec = av_gettime_relative();
if (pSwsCtx) /* it is NOT USED now because it is very slow, WHY??? and pOutFrm = pInpFrm */
{
pOutFrm->pts = pInpFrm->pts;
sws_scale(pSwsCtx,
(const uint8_t * const *) pInpFrm->data, pInpFrm->linesize, 0, pInpCdcCtx->height,
pOutFrm->data, pOutFrm->linesize);
}
else
{
pInpFrm->key_frame = 0;
pInpFrm->pict_type = AV_PICTURE_TYPE_NONE;
}
int64_t time_sws = av_gettime_relative();
if ((rt = avcodec_send_frame(pOutCdcCtx, pOutFrm)) < 0)
goto ERROR_FRM;
do {
rt = avcodec_receive_packet(pOutCdcCtx, pOutPkt);
if (rt == AVERROR_EOF || rt == AVERROR(EAGAIN))
break;
else if (rt < 0)
goto ERROR_PKT;
int64_t time_enc = av_gettime_relative();
fprintf(stdout, "Packet size inp: %d out: %d bytes Time decode: %.2f scale: %.2f encode: %.2f transcode: %.2f ms ...\r",
pInpPkt->size, pOutPkt->size, (time_dec - time_start)/1000.0, (time_sws - time_dec)/1000.0, (time_enc - time_sws)/1000.0, (av_gettime_relative() - time_start)/1000.0);
rt = av_interleaved_write_frame(pOutFmtCtx, pOutPkt);
av_packet_unref(pOutPkt);
} while (rt >= 0);
av_frame_unref(pInpFrm);
} while (rt >= 0);
return 0;
ERROR_PKT:
av_packet_unref(pOutPkt);
ERROR_FRM:
av_frame_unref(pInpFrm);
ERROR:
PrintError("Error transcoding", rt);
return rt;
}