AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Internetradio
Thema durchsuchen
Ansicht
Themen-Optionen

Internetradio

Ein Thema von markus5766h · begonnen am 27. Apr 2009 · letzter Beitrag vom 4. Aug 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von markus5766h
markus5766h
Registriert seit: 5. Mär 2009
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
Miniaturansicht angehängter Grafiken
screenshot4_211.jpg  
Angehängte Dateien
Dateityp: exe netradio3_105.exe (423,0 KB, 53x aufgerufen)
 
Benutzerbild von markus5766h
markus5766h

 
Delphi XE8 Professional
 
#2
  Alt 29. Apr 2009, 16:31
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)
Markus H.
  Mit Zitat antworten Zitat
AlexII

 
FreePascal / Lazarus
 
#3
  Alt 4. Mai 2009, 20:56
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.
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

 
Delphi XE8 Professional
 
#4
  Alt 5. Mai 2009, 17:26
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).
Markus H.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

 
Delphi 11 Alexandria
 
#5
  Alt 5. Mai 2009, 17:49
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.
  Mit Zitat antworten Zitat
AlexII

 
FreePascal / Lazarus
 
#6
  Alt 5. Mai 2009, 19:20
Gausi perfektioniere doch den Aufnahme Code, am besten gleich hier
  Mit Zitat antworten Zitat
AlexII

 
FreePascal / Lazarus
 
#7
  Alt 5. Mai 2009, 19:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

 
Delphi XE8 Professional
 
#8
  Alt 5. Mai 2009, 19:25
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.
Markus H.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

 
Delphi 11 Alexandria
 
#9
  Alt 6. Mai 2009, 06:47
Zitat von AlexII:
Gausi perfektioniere doch den Aufnahme Code, am besten gleich hier
Ä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.
  Mit Zitat antworten Zitat
AlexII

 
FreePascal / Lazarus
 
#10
  Alt 6. Mai 2009, 18:11
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:51 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