2012-04-04 18 views
5

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

Odpowiedz

0

DTS i PTS są mierzone w zegar 90 kHz. Patrz ISO 13818 część 1 sekcja 2.4.3.6 w dół poniżej tabeli składni.

Jeśli chodzi o zmienną liczbę klatek, twój framework może lub może nie mieć sposobu na wygenerowanie tego (vui_parameters.fixed_frame_rate_flag = 0). To, czy oprogramowanie do odtwarzania obsługuje to zupełnie inne pytanie. Większość graczy przyjmuje stałą liczbę klatek niezależnie od PTS lub DTS. mplayer nie może nawet poprawnie obliczyć szybkości klatek dla strumienia transportowego o stałej szybkości generowanego przez ffmpeg.

Myślę, że jeśli zamierzasz zmienić rozdzielczość, musisz zakończyć strumień (nal_unit_type 10 lub 11) i rozpocząć nową sekwencję. Może znajdować się w tym samym strumieniu transportowym (zakładając, że klient nie jest zbyt prosty).

Powiązane problemy