2011-12-13 18 views
9

Chcę przekonwertować obraz YUV420P (otrzymany ze strumienia H.264) na RGB, a także zmienić jego rozmiar, używając sws_scale.
Rozmiar oryginalnego obrazu to 480 × 800. Konwersja z tymi samymi wymiarami działa dobrze.
Ale gdy próbuję zmienić wymiary, mam zniekształcony obraz, z następującym wzorem:sws_scale YUV -> zniekształcony obraz RGB

  • zmieniających się 481 × 800 przyniesie zniekształcony B & W obrazu, który wygląda jakby wyciąć w środkowej
  • 482 × 800 będzie jeszcze bardziej zniekształcony
  • 483 × 800 jest zniekształcony ale w kolorze
  • 484 × 800 jest ok (skalowane poprawnie).

teraz ten wzór następująco - skalowanie będzie działać tylko w porządku, jeśli różnica między podziałami przez 4.

Oto przykładowy kod z drogi, że dekodowania i konwersji obrazu. Wszystkie metody pokazują "sukces".

int srcX = 480; 
int srcY = 800; 
int dstX = 481; // or 482, 483 etc 
int dstY = 800; 

AVFrame* avFrameYUV = avcodec_alloc_frame(); 
avpicture_fill((AVPicture *)avFrameYUV, decoded_yuv_frame, PIX_FMT_YUV420P, srcX , srcY); 

AVFrame *avFrameRGB = avcodec_alloc_frame(); 

AVPacket avPacket; 
av_init_packet(&avPacket); 
avPacket.size = read; // size of raw data 
avPacket.data = raw_data; // raw data before decoding to YUV 

int frame_decoded = 0; 
int decoded_length = avcodec_decode_video2(g_avCodecContext, avFrameYUV, &frame_decoded, &avPacket); 
int size = dstX * dstY * 3; 

struct SwsContext *img_convert_ctx = sws_getContext(srcX, srcY, SOURCE_FORMAT, dstX, dstY, PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL); 

avpicture_fill((AVPicture *)avFrameRGB, rgb_frame, PIX_FMT_RGB24, dstX, dstY); 
sws_scale(img_convert_ctx, avFrameYUV->data, avFrameYUV->linesize, 0, srcY, avFrameRGB->data, avFrameRGB->linesize); 

// draws the resulting frame with windows BitBlt 
DrawBitmap(hdc, dstX, dstY, rgb_frame, size); 

sws_freeContext(img_convert_ctx); 
+0

W sws_getContext() funkcjonować są przechodzącą jako parametr format identyfikatora PIX_FMT_BGR24 zamiast PIX_FMT_RGB24 jak to zrobić w avpicture_fill –

+0

krępuj się pisać błąd w https://ffmpeg.org/trac/ffmpeg/newticket –

+0

prawda kiedykolwiek zmusić to do działania? – sendmoreinfo

Odpowiedz

-1

Po dokonaniu bitmapy, szerokość obrazu musi być wielokrotnością 4.

Więc trzeba zmienić szerokość jak 480, 484, 488, 492 ...

Tutaj to metoda zmiany na wiele z 4

Mam nadzieję, że rozwiążesz problem.

+0

Nie, to nie musi być wielokrotność 4. Fragment kodu jest jeszcze dalej od całości, ponieważ demonstruje jak wyrównać szerokość, nie ma to znaczenia dla pytania. –

Powiązane problemy