LINUX.ORG.RU

FFmpeg libav какие настройки для H264???

 ,


0

1

Приветствую

Продолжаю мучать перекодировку из mjpeg в libx264 с отдачей в rtsp

Имею вот такие дампы входного-выходного потоков

Input #0, video4linux2,v4l2, from '/dev/video0':
  Duration: N/A, start: 360486.479951, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 15 fps, 15 tbr, 1000k tbn
[libx264 @ 0x14e82c0] using cpu capabilities: ARMv6 NEON
[libx264 @ 0x14e82c0] profile Main, level 2.2
[libx264 @ 0x14e82c0] 264 - core 148 r2643 5c65704 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=15 b_pyramid=2 b_adapt=0 b_bias=0 direct=1 weightb=0 open_gop=0 weightp=0 keyint=450 keyint_min=30 scenecut=0 intra_refresh=0 rc=abr mbtree=0 bitrate=500 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 pb_ratio=1.30 aq=0
Output #0, rtsp, to 'rtsp://IP:554/cam':
  Stream #0:0: Video: h264, yuv420p, 640x480, q=2-31, 500 kb/s, 15 tbn

Из всего этого выхлопа для х264 мной явно задано

bframes=15
b_adapt=0
keyint=450
keyint_min=30
bitrate=500

+    av_dict_set(&pOutDic, "rtsp_transport", "udp", 0);
+    av_dict_set(&pOutDic, "preset", "ultrafast", 0);

И решил значит глянуть а что же там с размерами, почему видео тормозит (хоть и не рассыпается)

fprintf(stdout, "Packet size inp: %d out: %d bytes Frame type: %d/%d\n", pInpPkt->size, pOutPkt->size, pFrm->key_frame, pFrm->pict_type);

Packet size inp: 70736 out: 50267 bytes Frame type: 1/1
Packet size inp: 70924 out: 49739 bytes Frame type: 1/1
Packet size inp: 70896 out: 49747 bytes Frame type: 1/1
Packet size inp: 70992 out: 49694 bytes Frame type: 1/1
Packet size inp: 70948 out: 49946 bytes Frame type: 1/1
Packet size inp: 70960 out: 49851 bytes Frame type: 1/1
Packet size inp: 70992 out: 88760 bytes Frame type: 1/1
Packet size inp: 71120 out: 154355 bytes Frame type: 1/1
Packet size inp: 71160 out: 161420 bytes Frame type: 1/1
Packet size inp: 71244 out: 161778 bytes Frame type: 1/1
Packet size inp: 71216 out: 161368 bytes Frame type: 1/1
Packet size inp: 71420 out: 161916 bytes Frame type: 1/1
Packet size inp: 71308 out: 161637 bytes Frame type: 1/1
Packet size inp: 71440 out: 162195 bytes Frame type: 1/1
Packet size inp: 71564 out: 162253 bytes Frame type: 1/1
Packet size inp: 71516 out: 162041 bytes Frame type: 1/1
Packet size inp: 71712 out: 162148 bytes Frame type: 1/1
Packet size inp: 71880 out: 162662 bytes Frame type: 1/1

А как так получается, что кодированный поток х264 занимает БОЛЬШЕ места, чем мжпег??? и почему у меня каждый кадр ключевой?

Если не сложно, может еще что важно указать??? Нужно более менее качество, чтоб без квадратов, главное чтобы не тормозило видео.

★★★

Последнее исправление: wolverin (всего исправлений: 1)

Ответ на: комментарий от kto_tama

мне нужно в канал 500 кбитс укладываться, поэтому такой битрейт мне не подходит, касаемо же preset то замена с ультафаст на верислоу никак не поменяло, то что я получаю каждый кадр ключевой, а не В и Р кадры изменений + фпс упал ко всему, итак еле видео шелевится.

wolverin ★★★
() автор топика
Ответ на: комментарий от kto_tama

на размер влияют конечно qmax и qmin квантователя, задавал от 10 до 20, может меньше надо!?

но куда деваются В кадры конечно не понятно

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)

код полностью покажите; однако предположу, что у mjpeg все ключевые и вы получая из него avframe пихаете как есть в h264, нужно снять key_frame поле; also rtsp плохо работает с b-frame, лучше не включать их в вашем случае

hizel ★★★★★
()
Ответ на: комментарий от hizel

наконец то вы пришли!!! ))

да конечно, у мжпег все опорные, т.е. мне надо каждые Н кадров самому key_frame скидывать?

вот такая вот херабора у меня получилось

int WriteStream()
{
    int rt = 0;

    if ((rt = avcodec_send_packet(pInpCdcCtx, pInpPkt)) < 0)
        goto ERROR;

    do {
        rt = avcodec_receive_frame(pInpCdcCtx, pFrm);
        if (rt == AVERROR_EOF || rt == AVERROR(EAGAIN))
            break;
        else if (rt < 0)
            goto ERROR_FRM;

        if ((rt = avcodec_send_frame(pOutCdcCtx, pFrm)) < 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;

            pOutPkt->stream_index = pInpPkt->stream_index;


            fprintf(stdout, "Packet size inp: %d out: %d bytes Frame type: %d/%d\n", pInpPkt->size, pOutPkt->size, pFrm->key_frame, pFrm->pict_type);

            rt = av_write_frame(pOutFmtCtx, pOutPkt);

            av_packet_unref(pOutPkt);
        } while (rt >= 0);

        av_frame_unref(pFrm);
    } while (rt >= 0);

    return 0;

ERROR_PKT:
    av_packet_unref(pOutPkt);

ERROR_FRM:
    av_frame_unref(pFrm);

ERROR:
    PrintError("Error transcoding", rt);

    return rt;
}

wolverin ★★★
() автор топика
Ответ на: комментарий от hizel

поставил pFrm->key_frame = 0; после avcodec_receive_frame и перед avcodec_send_frame, хоть теперь вывод стал для фрейма 0/1 т.е. кадр не ключевой, а тип его AV_PICTURE_TYPE_I

что вообщем то ничего не изменило, bit_rate конечно же задан, 500кбс

может в этих значениях что то не так

keyint=450

keyint_min=30

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 2)
Ответ на: комментарий от hizel

как оказалось эффект от сброса кей_фрейм и типа появляется только если убрать значение БИТРЕЙТА! тогда я четко ПО РАЗМЕРУ вижу И кадры через keyint количество Р кадров

однако мне все равно для уверенности надо отрезать по верху битрейт для узкого инет канала, поэтому попробовал поставить rc_max_rate и rc_buffer_size, после чего включились какие значения vbv_*, появился тип crf с коэффициентом 28 и В кадры, может чего еще ффмпег навключал сам и видео осыпалось (

wolverin ★★★
() автор топика