Delphi-PRAXiS

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:

markus5766h 7. Mai 2009 15:58

Re: Internetradio
 
neue Version ist im ersten Beitrag: der WaveHeader ist nun entfernt

S4SH1981 24. Jun 2009 21:22

Re: Internetradio
 
Hallo,

muss sagen ein schönes Programm.
Nur wie sieht es aus, wenn ich das Farbschema änder, danach wieder auf das ursprüngliche zu gelangen.
er bleibt bei mir beim letzten schema stehen und fängt nicht von vorne an.

und wie fühe ich neue sender ein.
z.b.
http://www.einslive.de/multimedia/li...l_einslive.m3u

Gruß S4SH

markus5766h 25. Jun 2009 15:22

Re: Internetradio
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo, S4SH1981
das Farbschema Nr. 13 und Nr. 14 änderst Du mit der Taste "C" - rechts oben.
Über die Pfeiltasten (Up / Down) kannst Du zwischen den Farbschemata navigieren.
Das eingestellte Farbschema bleibt so lange bestehen, wie es nicht über die
Pfeiltasten geändert wird, also auch, wenn Du ein Farbschema Nr. 13 oder 14
erstellt hast, musst Du noch dahin navigieren.

bei den Farben war evt. noch ein Fehler vorhanden, aktualisierte Version ist hochgeladen

Für das Hinzufügen neuer Sender, betätige die Taste "+" unter der Lautstärkeregelung.
In einenm neuen Fenster kannst Du nun den Url eingeben und testen bzw. mit speichern
übernehmen.

S4SH1981 25. Jun 2009 15:34

Re: Internetradio
 
okay, mit dem farbschema funktioniert. hast ja auf dem foto im anhang nen schönen kreis drum gemacht.

aber mit den urls hinzufügen geht nicht, zumindest nicht mit
http://www.einslive.de/multimedia/li...l_einslive.m3u
bei dem beispiel in den demos von bass gehts?

markus5766h 25. Jun 2009 15:39

Re: Internetradio
 
Hallo,
es wird mit einigen Urls bzw. Stream-Formaten nicht gehen.
Für 20 funktionierende Streams hab' ich ca. 50 ausprobiert.
Es findet auch keine Kodierungserkennung im Programm statt
- vielleicht setz ich das noch mal um.

Jürgen Thomas 4. Aug 2009 09:14

Re: Internetradio
 
Hallo Markus,

das Programm interessierte mich, weil ich einen Stream zeitgesteuert aufnehmen möchte. Allerdings bin ich gescheitert, weil "mein" Sender nicht abgespielt werden kann.

Unter RBB-Kulturradio werden drei Varianten angeboten:

http://www.kulturradio.de/live.smil für Real Player
http://www.kulturradio.de/live.wax für den Windows Media Player
mms://stream2.rbb-online.de/wmtencoder/kulturradio-live.wma für Internet-Radios

Aber bei jeder dieser Varianten meldet dein Programm sofort:
Zitat:

Can't play the stream
(error code: 0)
Hast du eine Erklärung und eine Alternative?

Übrigens vermisse ich die Möglichkeit, einen vorhandenen Sender zu ändern und die Liste nach "Genre" zu sortieren.

Gruß Jürgen


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz