Wyobraźmy mam H.264 AnxB ramek pochodzących z rozmowy w czasie rzeczywistym. Jaki jest najlepszy sposób enkapsulacji w strumieniu transportowym MPEG2 przy zachowaniu informacji o taktowaniu dla kolejnego odtwarzania?enkapsulacji strumieni H.264 zmiennego framerate w MPEG2 strumienia transportowego
używam biblioteki libavcodec i libavformat. Kiedy otrzymam wskaźnik do obiektu (* pcc) typu AVCodecContext, ustawiam foll.
pcc->codec_id = CODEC_ID_H264;
pcc->bit_rate = br;
pcc->width = 640;
pcc->height = 480;
pcc->time_base.num = 1;
pcc->time_base.den = fps;
Po otrzymaniu jednostek NAL tworzę pakiet AVPacket i wywołuję av_interleaved_write_frame().
AVPacket pkt;
av_init_packet(&pkt);
pkt.flags |= AV_PKT_FLAG_KEY;
pkt.stream_index = pst->index;
pkt.data = (uint8_t*)p_NALunit;
pkt.size = len;
pkt.dts = AV_NOPTS_VALUE;
pkt.pts = AV_NOPTS_VALUE;
av_interleaved_write_frame(fc, &pkt);
Mam zasadniczo dwa pytania:
1) dla zmiennej prędkości klatek, czy istnieje sposób, aby nie określić FOLL. pcc-> time_base.num = 1; pcc-> time_base.den = fps; i zastąpić go czymś, aby wskazać zmienną liczbę klatek na sekundę?
2) Podczas przesyłania pakietów, jakie "znaczniki czasu" należy przypisać do pkt.dts i pkt.pts?
Teraz, gdy gram wyjście używając ffplay to gra przy stałej prędkości klatek (fps), które używam w powyższym kodzie.
Ja też chciałbym wiedzieć, jak dostosować różnej rozdzielczości przestrzennej. W strumieniu, który otrzymuję, każda klatka kluczowa jest poprzedzona przez SPS i PPS. Wiem, kiedy zmienia się rozdzielczość przestrzenna. Czy istnieje sposób, aby nie trzeba określać pcc-> width = 640; pcc-> wysokość = 480; z góry? Innymi słowy, wskaż, że rozdzielczość przestrzenna może zmienić średni strumień.
Dzięki dużo, Eddie