AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Sounddatei als Blob in SQLite
Thema durchsuchen
Ansicht
Themen-Optionen

Sounddatei als Blob in SQLite

Offene Frage von "wschrabi"
Ein Thema von SittingDuck · begonnen am 14. Nov 2014 · letzter Beitrag vom 23. Nov 2016
Antwort Antwort
SittingDuck

Registriert seit: 11. Jan 2006
Ort: Leverkusen
159 Beiträge
 
Delphi 2010 Professional
 
#1

Sounddatei als Blob in SQLite

  Alt 14. Nov 2014, 11:27
Datenbank: SQLite • Version: 3.8.5 • Zugriff über: TSQLiteDatabase
Moin Moin ...

In einer SQLite Tabelle wurden *.m4a Dateien in Blob-Felder gepackt. Diese möchte ich auslesen und abspielen. Erwartet hatte ich ein Ergebnis in dieser Art: (HEX-Auszug des Headers)
Code:
00 00 00 1C 66 74 79 70 4D 34 41 20 00 00 00 00  ....ftypM4A ....
4D 34 41 20 6D 70 34 32 69 73 6F 6D 00 00 00 08  M4A mp42isom....
Jedoch sieht die Datei nach dem Speichern leider so aus und ist demnach dann auch nicht direkt abspielbar.
Code:
00 00 00 00 00 00 00 1C 00 66 00 74 00 79 00 70  .........f.t.y.p
00 4D 00 34 00 41 00 20 00 00 00 00 00 00 00 00  .M.4.A. ........
00 4D 00 34 00 41 00 20 00 6D 00 70 00 34 00 32  .M.4.A. .m.p.4.2
Die Daten lese ich ungefähr folgendermaßen aus:
Code:
var Blob: TSQLiteBlobStream; ms: TStringStream; b: Byte;

ms := TStringStream.Create('');
if Blob.Size > 0 then begin
 ms.Position := 0;
 ms.CopyFrom(Blob, Blob.Size);
 // with Blob do
 // while Position < Pred(Size) do begin
 // Read(b, 1);
 // if Odd(Position) then ms.WriteBuffer((b), 1);
 // end; ^^ tut es leider auch nicht ... Unicode, UTF8 ?
 Blob.Free;
 ms.Position := 0;
 ms.SaveToFile('Test.m4a');
end;
Die auskommentierten Stellen zeigen einen Versuch nur jede zweite Zahl zu nehmen, aber das funktioniert leider auch nicht, weil über die gesamte Datei gesehen eben nicht nur Nullen vor jeder Zahl stehen, sondern auch ab und zu mal ein $FF oder $04 oder eine $06 übersprungen wird. Warscheinlich ist die Lösung ganz einfach, aber ich komme hier nicht weiter. Danke schon mal für Eure Hilfe.

Total verHEXt grüßt ...
Ciao ... SittingDuck
iPhone Backup und mehr: iTwin v3.9 Beta ... Alternative Startleiste: Launcher v3.8 !
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Sounddatei als Blob in SQLite

  Alt 14. Nov 2014, 11:31
Das sieht sehr nach Unicode aus.
Markus Kinzler
  Mit Zitat antworten Zitat
SittingDuck

Registriert seit: 11. Jan 2006
Ort: Leverkusen
159 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Sounddatei als Blob in SQLite

  Alt 14. Nov 2014, 11:36
Das dachte ich mir auch schon, als ich gemerkt hatte, das nicht einfach in jeder zweiten Zahl "die Musik spielt" (starkes Wortspiel, oder?) Wie genau bringe ich die Daten dann wieder in seine ursprüngliche Form zurück?
Ciao ... SittingDuck
iPhone Backup und mehr: iTwin v3.9 Beta ... Alternative Startleiste: Launcher v3.8 !
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Sounddatei als Blob in SQLite

  Alt 14. Nov 2014, 11:46
Nimm mal einen MemoryStream und schau wie die Daten da kommen.
Markus Kinzler
  Mit Zitat antworten Zitat
SittingDuck

Registriert seit: 11. Jan 2006
Ort: Leverkusen
159 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Sounddatei als Blob in SQLite

  Alt 14. Nov 2014, 12:04
Danke schon mal für die Antwort. Naja, wenn ich das von TStringStream auf TMemoryStream ändere, dann sieht das erstmal genau gleich aus. Die Frage bleibt jedoch, wie ich das jetzt sinnvoll konvertiere. Bei StringStream habe ich auch schon mit sämtlichen Version von
Code:
TStringStream.Create('', TEncoding.WasAuchImmer);
herum gespielt, was aber auch nicht den gewünschten Effekt brachte. Gibt es denn da keine System-Routine welche ich auf diesen Datenstrom anwenden könnte?
Ciao ... SittingDuck
iPhone Backup und mehr: iTwin v3.9 Beta ... Alternative Startleiste: Launcher v3.8 !
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Sounddatei als Blob in SQLite

  Alt 14. Nov 2014, 12:34
Da würde ich mal sagen, da hat jemand ganze Arbeit geleistet und die binären Daten als string eingelesen (natürlich Unicode -> UTF16 -> 2 Bytes pro Zeichen) und dann in die Datenbank geschrieben.

Respekt ... da wusste einer aber ganz genau Bescheid, was er da tut

Dir ist schon bewusst, um was für eine Codierung es sich handelt? TEncoding.BigEndianUnicode .

Kleines Beispiel:
Delphi-Quellcode:
program dp_182745;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

procedure OutputBytes( ABytes: TBytes );
var
  LIdx: Integer;
begin
  for LIdx := Low( ABytes ) to High( ABytes ) do
    Write( Format( '%2.2x ', [ABytes[LIdx]] ) );
  WriteLn;
end;

procedure Sample;
var
  LData: TBytes;
  LDataStr: string;
begin
  LData := TBytes.Create( $00, $00, $00, $00, $00, $00, $00, $1C, $00, $66, $00, $74, $00, $79, $00, $70, $00, $4D, $00, $34, $00, $41, $00, $20 );
  OutputBytes( LData );
  LDataStr := TEncoding.BigEndianUnicode.GetString( LData );
  LData := TEncoding.ANSI.GetBytes( LDataStr );
  OutputBytes( LData );
end;

begin
  try
    Sample;
  except
    on E: Exception do
      WriteLn( E.ClassName, ': ', E.Message );
  end;
  ReadLn;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
wschrabi

Registriert seit: 16. Jan 2005
437 Beiträge
 
#7

AW: Sounddatei als Blob in SQLite

  Alt 23. Nov 2016, 20:26
Hallo
Ich habe ein ähnliches PRoblem:

Ich habe eine SQLITE DB wo ID in Table REF und Location und ReferenceID in Table LOcation BLOB sind. (sind eigl. GUID in binärer Form, da das Devat Unidac die OPtion Binary GUID = False nicht hat muß ich so herumwurschtln)

Jetzt möchte ich in Location einen Record in Location mit random ID und einen von REF herausgelesenen GUID eintragen (insert)
Doch ich komm nicht weiter... vielleicht muss es doch viel einfacher gehen

BIn für jeden RAT DANKBAR!

Ich dachte mir so:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
   blobID, blobRefID: system.Classes.TStream;
   MyStreamID: TMemoryStream;
   MyGuid0: TGUID;
   sISBN,oldURL: string;
   sLINK: string;
   nRECNUM: integer;
  k: Integer;
begin
   nRecnum:=0;
   while not(uniquery1.Eof) do
      begin
      nRecNUm:=nrECNUm+1;
      sISBN:=Uniquery1.FieldByName('ISBN').AsString;
           
      if getlinefromMemo(sISBN) then
         begin
         label4.Caption:=Format('LINKs found: %d @ RecNr.: %d',[listbox1.Count,Nrecnum]);
         for k := 0 to listbox1.Count-1 do
            begin
            MyStreamID := TMemoryStream.Create;

            
            if UniConnection1.ProviderName='SQLitethen
               begin
               (*
              // INsert into location in Citavi DB
              > insert into Location (ID,Address,ReferenceID,CreatedOn,ModifiedOn,AddressInfo,LocationType,PreviewBehaviour)
              > (
              >    :MyRANDGUID,
              >    :FILENAME,
              >    :RefID,
              >    datetime(strftime('%s','now'), 'unixepoch', 'localtime'),
              >    datetime(strftime('%s','now'), 'unixepoch', 'localtime'),
              >    1,
              >    0,
              >    0); 
                 *)

                 blobID := UniQuery1.CreateBlobStream(UniQuery1.FieldByName('ID'), bmRead); // HIER HAPPERTS.
                 MyStreamID.Clear;
                 MyStreamID.LoadFromStream(blobID );
                 uniquery2.ParamByName('RefID').LoadFromStream(MyStreamID, ftBlob);
                 CreateGUID(MyGuid0);
                 uniquery2.ParamByName('MyRandGUID').AsBlob:=TEncoding.UTF8.GetBytes(GUIDToString(MyGuid0));
                 
                 
               Label5.Caption:=Format('DB Record GUID: %s : %s',[uniquery1.FieldByName('MYID').AsString,uniquery1.FieldByName('ID').AsString]);
               end
            else
               begin
               uniquery2.SQL.Text:=' Update refs set URL = :Filename where id = :RefID';
               
               if not(checkbox3.Checked) then
                  uniquery2.SQL.Text:=' Update refs set link_to_pdf = :Filename where id = :RefID';
               
               uniquery2.ParamByName('RefID').AsString:=uniquery1.FieldByName('id').AsString;
               end;
               
            if (UniConnection1.ProviderName='MySQL') then
               begin
               if not(checkbox3.Checked) then
                  oldURL:=uniquery1.FieldByName('link_to_pdf').AsString
               else
                  oldURL:=uniquery1.FieldByName('url').AsString;
               
               end;
            if trim(oldURL) = 'then
               uniquery2.ParamByName('Filename').AsString:=convertfn(listbox1.Items[k])
            else
               uniquery2.ParamByName('Filename').AsString:=oldURL+#13#10+convertfn(listbox1.Items[k]) ;
               
            uniquery2.Execute;
            MyStreamID.Free;
            WriteLOgMemo(Format('UPD: ISBN: %s -> Affected Rows: %d',[sISBN,uniquery2.RowsAffected]));
            end;
         Application.ProcessMessages;
         
         end;
      
      uniquery1.Next;
      end;
      WriteLOgMemo(Format('UPDATE with URLs finished: Total affected Rows: %d',[nrecnum]));
      
end;
so hab ich es auch probiert: Immer ungültige Typenumwandlung bei der 1. zeil

Delphi-Quellcode:
                 blobID := UniQuery1.FieldByName('ID') as TBlobField;
                 BlobID.LoadFromStream(MyStreamID);
                 TBlobField(UniQuery2.FieldByName('RefID')).LoadFromStream(MyStreamID);
                 CreateGUID(MyGuid0);
                 uniquery2.ParamByName('MyRandGUID').AsBlob:=TEncoding.UTF8.GetBytes(GUIDToString(MyGuid0));

Geändert von wschrabi (23. Nov 2016 um 20:45 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz