konwersja plików ciff na avi oraz z avi na cif

0

Witam mam do napisania program "konwersja plików ciff na avi oraz z avi na ciff" w c++ Builderze. Program ma tez miec mozliwość odtwarzania tych plików. Prosilbym o pomysly od czego zaczac ten program.

0

Witam!

Wlasnie pisze identyczny program, tylko ze to jest moja praca dyplomowa.
Gdzie studiujesz?

Pozdro!

Przede wszystkim musisz zaczac od poznania budowy plikow CIF, a nastepnie zapoznac sie z przestrzenia kolorow RGB (pliki AVI) oraz YUV (pliki CIF).

Jesli juz bedziesz to kojarzyl mozemy przejsc dalej...

0

Cześć!

Dawno nie zaglądałem bo myślałem ze już nikt nie odpowie.

Z wymienionymi przez ciebie elementami już się zapoznałem. Nie wiem natomiast jak wyodrębnić poszczególną klatkę z pliku oraz ją skonwertować.

0

No to zaczynamy...
Jesli chodzi o pliki CIF (SQCIF,QCIF,CIF,4CIF) ich budowa jest analogiczna wiec przedstawie Ci tylko budowe pliku CIF.

Klatka w pliku CIF ma wymiary 352x288 pikseli. Na pojedyncza klatke skladaja sie 3 bloki. Najpierw w klatce mamy skladowe Y (kazda opisuje jeden piksel wiec jest ich w sumie 352x288=101376), pozniej znajduje sie skladowa U i V, przy czym te skladowe maja rozmiar o polowe mniejszy w stosunku do skladowej Y. Tak wiec rozmiar jednej klatki dla formatu CIF to: 352x288(Y) + 176x144(U) + 176x144(V) = 152064.
Aby wyodrebnic poszczegolne klatki wystarczy pobrac z pliku odpowiednia ilosc bajtow, w przypadku plikow CIF jest to wlasnie 152064.
Otrzymujemy bajty ktore opisane sa przestrzenia kolorow YUV, teraz musimy jest skonwertowac na przestrzen RGB (chociazby po to aby wyswietlic klatki filmu).
Konwersji mozna dokonac na dwa sposoby: za pomoca kodek VIDC (poczytaj na MSDN'ie Microsoftu) lub za pomoca wzorow:
R = 1,164 (Y - 16) + 2,018 (U - 128),
G = 1,164 (Y - 16) - 0,813 (U - 128) - 0,391 (V - 128),
B = 1,164 (Y - 16) + 1,596 (V - 128).

Jesli wszystko zrobic zgodnie z tym co Ci napisalem otrzymasz przestrzen kolorow RGB.
I wazna rada: klatka CIF ma rozmiar 152064, a w przypadku RGB (24 bity na piksle) klatka bedzie 2 razy wieksza!!! Otrzymasz klatke nieskompresowana, a o kompresji porozmawiamy pozniej... ;)

0

Właśnie mój największy problem polega na tym, że nie wiem jak pobrać z pliku odpowiednią ilość bajtów. W przypadku samej bitmapy zrobiłbym bym tak:

DoubleBuffered = true;
 Graphics :: TBitmap * bmp = new Graphics :: TBitmap();
 bmp -> Width = 352;
 bmp -> Height = 288;
 bmp -> PixelFormat =pf24bit;
 Image1 -> Picture -> Assign(bmp);

A następnie wczytał bitmapę:

if(OpenPictureDialog1->Execute())
 Image1 ->Picture -> LoadFromFile(OpenPictureDialog1->FileName);

Nie wiem natomiast jak postępować w przypadku Pliku Avi lub Cif.

P.S Program jaki mam napisać ogranicza się do jednego formatu Cif 352x288.

0

Witam!

Aby dobrac sie do klatki w pliku CIF nalezy zrobic tak...

//Zmienne globalne
unsigned char *Y;    //wskaznik do danych Y w jednej klatce CIF
unsigned char *U;    //wskaznik do skladowych U w jednej klatce CIF
unsigned char *V;    //wskaznik do skladowych V w jednej klatce CIF

TFileStream *plik ;           //wskaznik do otwieranego pliku
unsigned char rgb[304128];           //tablica na przekonwertowane skladowe RGB

//W funkcji robimy tak
plik = new TFileStream(OpenDialog1->FileName,fmOpenRead);  //wskaznik ustawiamy na wczytanym pliku
plik->Seek(0,0);                       //wskaznik pozycjonowania ustawiamy na poczatku wczytanego pliku

        plik->Read(Y,352*288);     //funkcja Read kopiuje blokowo bajty z pliku
        plik->Read(U,176*144);     //dzieki temu mamy juz wszystkie skladowe
        plik->Read(V,176*144);     //Y, U, V wypelnione informacjami z tylko jednej klatki

Plik CIF ma to do siebie ze nie posiada naglowka. W pliku tym znajduja sie wylacznie dane opisujace poszczegolne klatki sekwencji wideo. Informacje o tym pliku pochodza jedynie z rozszerzenia tego pliku, dlatego tez musisz ustrzegac sie przed wczytaniem innych typow plikow o rozszerzeniu CIF poprzez sprawdzenie czy wczytany plik dzieli sie bez reszty przez wartosc 152064 co jest wielkoscia jednej klatki w plikach CIF. Tak wiec wielkosc tych plikow jest po prostu wielokrotnoscia wartosci 152064. ;)

Za pomoca wzoru podanego przeze mnie wczesniej nalezy skonwertowac skladowe YUV na RGB...

1 użytkowników online, w tym zalogowanych: 0, gości: 1