[ XGhost @ 09.04.2009. 15:03 ] @
Jel mogu (i kako ) u bazu podataka ubaciti i cuvati video fajlove npr avi i sl format
po mogucnosti u firebird ili paradox bazu podataka, te da ih pozivam i pregledam
sa komponentom MediaPlayer.
Proceduru sa koristenjem video fajlova sa hd ili medija znam ali mi je bitno da ih mogu ubaciti
u bazu podataka ili da ih zastitim na drugi nacin od koristenja izvan moje aplikacije
[ Boris B. @ 09.04.2009. 18:38 ] @
Koriscenjem tzv. BLOB polja (binary large object) mozes da strpas u bazu bilo kakav binarni sadrzaj. Na MSSQL serveru odgovarajuci tip podatka je image, na Postgres-u je bytea (byte array) sa FB/IB-om nisam nikad radio mada pretpostavljam da ima nesto slicno (Google kaze BLOB SUBTYPE 0).

Ako nemas napravljen svoj streaming prvo snimis BLOB podatke u privremeni fajl, zatim ga pustas sa MediaPlayer komponentom. Problem sa BLOB-ovima, pogotovo za velika fajlove (video), je da moras da procitas ceo record iz baze pre nego sto mozes da pustis fajl, jer je SELECT atomicna blocking operacija. Ali posto si napisao da bi koristio MediaPlayer komponentu onda u svakom slucaju moras da prvo dovuces ceo fajl iz baze, snimis u temp datoteku i tek onda pustis. Zastiti video sa takvim pristupom ne mozes nikako, jer ce uvek (napredniji) korisnik moci da jednostavno iskopira temp fajl dok se pusta u player-u. Ne mozes ni da zakljucas fajl sa npr. ShareDenyRead jer onda ni MediaPlayer kao samostalni COM objekt nece moci da ga pusti.

Drugi, daleko bolji i tezi nacin je video streaming. Kod video streaming-a ne zapisujes ceo fajl u jedan record u bazi, nego rascepkas video na komade od npr. 128k i svaki komad zapises u svoj record. Cim se prvi komad dovuce iz baze mozes odmah da pustis video, ostali komadi se u pozadini skidaju dok video traje. U tom slucaju mozes da primenis svoj omiljeni algoritam za enkripciju, posle dovlacenja komada iz baze a pre punjenja play bafera, mada ako korisnik nema direktan dostup do baze onda ti enkripcija ni ne treba. Engine koji obezbedjuje potrebni video streaming je npr. DirectShow, jer pretpostavljam da neces "rucno" da radis dekodiranje videa. Programiranje takvog engine-a nije nimalo lak zadatak jer je DShow jedan on najkomplikovnijih API-ja koji postoji pogotovo iz ne-C jezika kao sto je Delphi, sustinski morao bi da napises svoj filter, izgradis graph i drzis palceve da ne eksplodira sve kad pustis. Do sada nisam nasao nijedan DShow program ili primer koji radi iole stabilno.
[ XGhost @ 09.04.2009. 18:55 ] @
Zahvaljujem na detaljnom odgovoru.
Pokusao sam eksperimente sa blob poljima medjutim sve je zavrsavalo neuspjesno, jel
postoji nacin za reprodukciju flash datoteka koje bi snimao tj stavljao na forme.
[ Boris B. @ 09.04.2009. 20:23 ] @
>Pokusao sam eksperimente sa blob poljima medjutim sve je zavrsavalo neuspjesno
Evo ti primer koriscenja BLOB polja za upis i citanje arbitrarne datoteke.
Code:

var
  St: TFileStream;
  ChunkSize, ByteCount, BuffSize: Integer;
  Buff: String;
begin
  ChunkSize := 16384;  
...
  // Pisanje datoteke u BLOB polje
  St := TFileStream.Create('C:\input.dat', fmOpenRead);
  try
    SetLength(Buff, St.Size);
    try
      BuffSize := 0;
      repeat
        ByteCount := St.Read(Buff[BuffSize + 1], ChunkSize);
        Inc(BuffSize, ByteCount);
      until ByteCount = 0;
      ADOQuery1.Edit;
      ADOQuery1.FieldByName('BlobField').AsString := Buff;
      ADOQuery1.Post;
    finally
      SetLength(Buff, 0);
    end;
  finally
    St.Free;
  end;
 ...
  // Citanje datoteke iz BLOB polja
  Buff := ADOQuery1.FieldByName('BlobField').AsString;
  ByteCount := 0;
  St := TFileStream.Create('C:\output.dat', fmCreate or fmOpenWrite);
  try
    while ByteCount < Length(Buff) do
      if ByteCount + ChunkSize <= Length(Buff) then
        Inc(ByteCount, St.Write(Buff[ByteCount + 1], ChunkSize))
      else
        Inc(ByteCount, St.Write(Buff[ByteCount + 1], Length(Buff) - ByteCount))
  finally
    St.Free;
  end;
end;


>jel postoji nacin za reprodukciju flash datoteka koje bi snimao tj stavljao na forme
Postoji, importuj ActiveX kontrolu Shockwave Flash. Ako je nema potrazi na Google-u "Flash ActiveX" i instaliraj


Edit:
Uhh... moze i daleko jednostavnije :)
Code:

TBlobField(ADOQuery1.FieldByName('BlobField')).LoadFromFile('C:\input.dat');
TBlobField(ADOQuery1.FieldByName('BlobField')).SaveToFile('C:\output.dat');

Samo je trebalo castovati u TBlobField...


[Ovu poruku je menjao Boris B. dana 09.04.2009. u 21:43 GMT+1]
[ XGhost @ 09.04.2009. 22:14 ] @
Zahvaljujem, sad mi slijedi eksperimentiranje
[ priki @ 10.04.2009. 10:55 ] @
Citat:
Boris B.: ...Na MSSQL serveru odgovarajuci tip podatka je image, na Postgres-u je bytea (byte array) sa FB/IB-om nisam nikad radio mada pretpostavljam da ima nesto slicno (Google kaze BLOB SUBTYPE 0).
.


image tip podataka u MSSQL-u treba izbegavati
izbacuju ih u sledecim verzijama MS SQL servera

http://msdn.microsoft.com/en-us/library/ms187993.aspx

druga stvar, bazu ces uzasno usporiti ako budes "trpao" video fajlove unutra
mislim da ti je mnogo bolje rešenje da ih snimaš na disk, file system, ili da dostupaš do njih preko linkova