LINUX.ORG.RU

История изменений

Исправление 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;
}