Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Internetradio (https://www.delphipraxis.net/133180-internetradio.html)

markus5766h 27. Apr 2009 13:13


Internetradio
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
ich probier gerad einige Sachen mit der Bass.dll.
Hier ist ein kleines Internet-Radio auf Basis
des Netradios aus den Demos entstanden:
keine Visualisierung o.ä. - einfach nur Radio.
...würde mich über Anregungen und auch Senderlisten freuen.


28.04: neue Version:
Senderliste ist sortierbar,
Genre wurde hinzugefügt
Schaltflächen geändert

29.04.; neue Version
12 Farbschemata hinzuzgefügt,
2 weitere Farbschemata sind frei konfigurierbar
vorerst letzte Version (ohne Feedback?)

07.05. : neue version, WaveHeader entfernt

markus5766h 29. Apr 2009 16:31

Re: Internetradio
 
Hallo,
die vorerst letzte Version ist hochgeladen.
aktuell verfügbare Einstellungen :
- Hinzufügen und Entfernen von Sender-Urls
- Zuweisung zu einem Genre
- Sortieren der Senderliste
- Auswählen aus 14 Farbschemata, davon 2 frei konfigurierbar
- Aufnahme
- Lautstärkeregelung (Wave-Regelung über MMSystem)

AlexII 4. Mai 2009 20:56

Re: Internetradio
 
Darf ich fragen wie du die Aufnahme realisiert hast? Gibt's ein Tutorial dazu oder hast du den Code selber geschrieben? Darf ich das vllt haben? Werde die sehr dankbar sein, denn allein kriege ich es nicht hin. :coder2:

markus5766h 5. Mai 2009 17:26

Re: Internetradio
 
Hallo,
beim Download der aktuellen Bass.dll (und auch älterer) sind eine
Hilfedatei und 'ne ganze Menge Demos dabei, die Dir sicherlich
weiterhelfen.


Delphi-Quellcode:
const
 Genre : array[0..21] of String =
   ('---', 'Klassik', 'Rock', 'Pop', 'Jazz', 'Techno', '80s', '60s', 'Trance', 'Blues',
    'FreeJazz', 'Trash', 'Folk', 'Funk', 'JazzFunk', 'Soul', 'HardRock', 'Weltmusik',
    'House', 'R&B', 'Reggae', 'Alternativ');
type
  WAVHDR = packed record
    riff:      array[0..3] of Char;
    len:      DWord;
    cWavFmt:      array[0..7] of Char;
    dwHdrLen:      DWord;
    wFormat:      Word;
    wNumChannels:   Word;
    dwSampleRate:   DWord;
    dwBytesPerSec:   DWord;
    wBlockAlign:   Word;
    wBitsPerSample:   Word;
    cData:      array[0..3] of Char;
    dwDataLen:      DWord;
  end;

var
  Form1: TForm1;
  Proxy: array [0..99] of char; //proxy server

  cthread: DWORD = 0;
  chan: HSTREAM = 0;
  win: hwnd;

  WaveStream: TMemoryStream;
  WaveHdr: WAVHDR; // WAV header

implementation


{$R *.dfm}

procedure TForm1.StartRec;
begin
 WaveStream.Clear;
 // erzeuge header für die WAV-datei
 with WaveHdr do
  begin
   riff := 'RIFF';
   len := 36;
   cWavFmt := 'WAVEfmt ';
   dwHdrLen := 16;
   wFormat := 1;
   wNumChannels := 2;
   dwSampleRate := 44100;
   wBlockAlign := 4;
   dwBytesPerSec := 176400;
   wBitsPerSample := 16;
   cData := 'data';
   dwDataLen := 0;
    end;
     WaveStream.Write(WaveHdr, SizeOf(WAVHDR));
end;

function RemoveInvalidChars(const sPDFFileName: String): String;
  var
    sFilePath, sFileName: String;
    i_lastBS, i : integer;
  begin
    i_lastBS := 0;

    for i := 1 to length(sPDFFileName) do
      begin
        if sPDFFileName[i] = '\' then
          begin
            i_lastBS := i;

          end;
      end;

    sFileName := copy(sPDFFileName, i_lastBS+1, length(sPDFFileName)-i_lastBS+1);
    sFilePath := copy(sPDFFileName, 0, i_lastBS);

    sFilePath := StringReplace(sFilePath, '/', '-', [rfReplaceAll, rfIgnoreCase]);
    sFilePath := StringReplace(sFilePath, '*', '-', [rfReplaceAll, rfIgnoreCase]);
    sFilePath := StringReplace(sFilePath, '?', '-', [rfReplaceAll, rfIgnoreCase]);
    sFilePath := StringReplace(sFilePath, '"', '-', [rfReplaceAll, rfIgnoreCase]);
    sFilePath := StringReplace(sFilePath, '<', '-', [rfReplaceAll, rfIgnoreCase]);
    sFilePath := StringReplace(sFilePath, '>', '-', [rfReplaceAll, rfIgnoreCase]);
    sFilePath := StringReplace(sFilePath, '|', '-', [rfReplaceAll, rfIgnoreCase]);

    sFileName := StringReplace(sFileName, '/', '-', [rfReplaceAll, rfIgnoreCase]);
    sFileName := StringReplace(sFileName, '\', '-', [rfReplaceAll, rfIgnoreCase]);
    sFileName := StringReplace(sFileName, ':', '-', [rfReplaceAll, rfIgnoreCase]);
    sFileName := StringReplace(sFileName, '*', '-', [rfReplaceAll, rfIgnoreCase]);
    sFileName := StringReplace(sFileName, '?', '-', [rfReplaceAll, rfIgnoreCase]);
    sFileName := StringReplace(sFileName, '"', '-', [rfReplaceAll, rfIgnoreCase]);
    sFileName := StringReplace(sFileName, '<', '-', [rfReplaceAll, rfIgnoreCase]);
    sFileName := StringReplace(sFileName, '>', '-', [rfReplaceAll, rfIgnoreCase]);
    sFileName := StringReplace(sFileName, '|', '-', [rfReplaceAll, rfIgnoreCase]);

    Result := sFilePath + sFileName;
end;

procedure TForm1.StopRec;
var
   i: integer;
  WaveFile : String;
  FileName : String;
begin
   if LabelTitle.Caption <> ''
    then WaveFile := SongFile + '.mp3'
     else WaveFile := 'unnamedStream'+IntToStr(Sn) + '.mp3';
      ListForm.FileList.Items.Add(WaveFile);
    // WAV-Header vervollständigen
    WaveStream.Position := 4;
    i := WaveStream.Size - 8;
    WaveStream.Write(i, 4);
    i := i - $24;
    WaveStream.Position := 40;
    WaveStream.Write(i, 4);
    WaveStream.Position := 0;

  FileName := RemoveInvalidChars((SongDir+Genre[StrToInt(SenderList[SenderIndex *3])] +'\'+WaveFile));
   if not FileExists(FileName)
    then
     try
      WaveStream.SaveToFile(FileName);
     except
     end;
   SaveStatus := True;
   if RecordStatus then
    begin
     {neue Aufnahme}
     WaveFile := '';
     StartRec;
    end;
end;
hier mal ein Teil meiner Unit, vielleicht hilfts, wenn nicht, kann ich Die die ganze Unit schicken,
musst sie dann nur noch ggf. graphisch anpassen.

........ ja, ja, ich weiß: das mit RemoveInvalidChars bekommt man elegenter hin, aber es laüft so schon seit meiner
Delphi-Anfangszeit >>>> never change a winning team(function).

Gausi 5. Mai 2009 17:49

Re: Internetradio
 
Zitat:

Zitat von markus5766h
Titel werden einzeln gespeichert : aber .....
nicht jeder Player spielt sie (WMP10, WMP11 : nicht, Audacity : ja,
Acoustica 3.3 : ja)
an diesem Problem arbeite ich noch - falls jemand 'ne Idee hat ...

Grobe Ursache des Problems: Du schreibst an den Anfang der Datei einen Wave-Header (beginnend mit RIFF, dann weitere Bytes aus dem Header), und packst dann die gestreamten Daten (meist mp3-kodiert) dahinter, was ziemlich unsinnig ist. Einige Player können das wohl kompensieren, andere nicht. Unter den anderen ist nebenbei auch meiner, der die Bass.dll zum abspielen nutzt. Das heißt, was du da mit der bass aufnimmst, kann die bass nicht abspielen - sollte man wirklich mal ändern. ;-)
Wenn man mit nem Hex-Editor die ersten paar Bytes aus der Datei löscht, und den Wave-Header damit unbrauchbar macht, greift die "MPEG-Frame-Header-Suche", die bei mp3-Dateien angewendet werden sollte, und die Datei wird abspielbar.

Lösung für dich: Lass das Wave-Gedöns, was du hier auch grade gepostest hast, einfach weg. Dann klappt es zumindest mit mp3-Streams, bei ogg geht das leider nicht.

AlexII 5. Mai 2009 19:20

Re: Internetradio
 
Gausi perfektioniere doch den Aufnahme Code, am besten gleich hier :thumb:

AlexII 5. Mai 2009 19:23

Re: Internetradio
 
Zitat:

Zitat von markus5766h
hier mal ein Teil meiner Unit, vielleicht hilfts, wenn nicht, kann ich Die die ganze Unit schicken,
musst sie dann nur noch ggf. graphisch anpassen.

Hab auch ein ähnliches Programm hier.

markus5766h 5. Mai 2009 19:25

Re: Internetradio
 
Hallo
ich hab das Problem erst mal damit gelöst, alle Dateien, die aufgenommen werden, durch die Lame.Exe
laufen zu lassen - zugegeben, auch keine elegante Lösung.
Letztendlich werd ich wohl erst mal abfragen müssen, wie die Streams kodiert sind und dann
explizit behandeln.

Gausi 6. Mai 2009 06:47

Re: Internetradio
 
Zitat:

Zitat von AlexII
Gausi perfektioniere doch den Aufnahme Code, am besten gleich hier :thumb:

Ähm, da gibt es nichts zu perfektionieren. Beim Aufruf von BASS_StreamCreateURL hast du bestimmt einen Parameter "StatusProc" oder so verwendet. Diese Prozedur sieht ungefähr so aus:
Delphi-Quellcode:
procedure StatusProc(buffer: Pointer; length: DWORD; user: Pointer); stdcall;
begin
...
  MyRecordStream.Write(buffer^, length);
...
end;
Da werden die empfangenen Daten in die Datei geschrieben. Da muss man nix durch Lame schicken. Einfach die Daten schreiben. Und den ganzen Kram mit dem WaveHdr einfach weglassen. Das sind dann mp3s, die einfach und problemlos abgespielt werden können. ;-)

Die paar Streams, die im ogg-Format senden (aac+ oder wma gehen ja hiermit sowieso nicht), kann man fürs erste doch ignorieren, später kann man dann die Formaterkennung dazubauen.

AlexII 6. Mai 2009 18:11

Re: Internetradio
 
Zitat:

Zitat von Gausi
Einfach die Daten schreiben. Und den ganzen Kram mit dem WaveHdr einfach weglassen. Das sind dann mp3s, die einfach und problemlos abgespielt werden können. ;-)

:roteyes:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:00 Uhr.
Seite 1 von 2  1 2      

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