Entwickler-Ecke

Multimedia / Grafik - mp3 Streaming an Shoutcast-Server: Stream verzerrt


MDX - Mi 22.05.13 04:25
Titel: mp3 Streaming an Shoutcast-Server: Stream verzerrt
Hallo,
nach einigem rumprobieren hab ich es mittlerweile geschafft nicht nur das Mikro (Standardbesiepil der bassenc.dll), sondern ein MP3-"Stream" (eigentlich Datei) an den Server zu übermitteln.
Der "Stream" wird dort auch abgespielt, jedoch in folgender, verzerrter Form: http://www1.zippyshare.com/v/51098/file.html (Zippyshare aufgrund des Flashplayers benutzt).

Hat irgendeiner die Idee woran es liegen könnte?

Hier der Code:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
var
  mixer: Integer = 0;
  encoder: HENCODE;
  stream: INteger;

procedure TForm1.FormCreate(Sender: TObject);
begin
[...]
     BASS_Init(1,44100,0,Application.Handle,0);
[...]
end;

procedure TForm1.Start;
begin
stream:=BASS_StreamCreateFile(false,PChar(ExtractFilePath(ParamStr(0))+'sound2.mp3'),0,0,BASS_STREAM_DECODE or BASS_UNICODE);
mixer:=BASS_Mixer_StreamCreate(441002, BASS_SAMPLE_FLOAT);
ok := BASS_Mixer_StreamAddChannel(mixer, stream, BASS_SAMPLE_FLOAT);
if not ok then
showmessage(inttostr(BASS_ErrorGetCode())); // Gibt keine Fehlermeldung aus!

BASS_ChannelSetAttribute(mixer, BASS_ATTRIB_VOL, 0); // Stream im Client muten
[...]

Command := 'lame -r -x -s 44100 -b '+PChar(inttostr(Bitrate))+' -';
Encoder := BASS_Encode_Start(mixer, PChar(Command), BASS_ENCODE_NOHEAD or BASS_ENCODE_AUTOFREE, nil0); 

  if not BASS_Encode_CastInit(Encoder, PAnsiChar(AnsiString(ed_server.text)),
  PAnsiChar(AnsiString(ed_Password.text)), content,
    PAnsiChar(AnsiString(ed_Name.text)), PAnsiChar(AnsiString(ed_url.text)), PAnsiChar(AnsiString(ed_Genre.text)),
     PAnsiChar(AnsiString(ed_desc.Text)), nil,
    bitrate, chk_Public.Checked) then
  begin
    BassError('Couldn''t setup connection with server');
    BASS_ChannelStop(mixer);
    mixer := 0;
    exit;
  end;
  btn_Start.Caption := 'Stop';
  BASS_ChannelPlay(mixer, FALSE); // resume recording
  ed_server.Enabled := false;
  ed_password.Enabled := false;
  ed_Name.Enabled := false;
  ed_genre.Enabled := false;
  ed_url.Enabled := false;
  ed_desc.Enabled := false;
  chk_public.Enabled := false;
  chk_MP3.Enabled := false;
  chk_OGG.Enabled := false;
  cb_Bitrate.Enabled := false;
  ed_TrackTitle.Enabled := true;
  ed_Tracktitle.Color := clwhite;
  LevelTimer.Enabled := true;
  BASS_Encode_SetNotify(encoder, @EncoderNotify, @Win); // notify of dead encoder/connection


Wäre dankbar wenn mir jemand hier helfen könnte!


Martok - Mi 22.05.13 22:12

Moin!

Da bin ich beim Skype-Recorder auch drüber geflogen ;-) BASSEnc streamt die Rohdaten auf den Encoder; entweder musst du selber die passenden WAVE_HDR generieren und mitliefern (das tut die eine Demo IIRC) oder im Raw-Modus (also -r, wie du hier hast) dem Encoder per Commandline ansagen, was du ihm schicken wirst.
In diesem Falle ist das Float, und das geht definitiv nicht. Du müsstest also z.B. 16bit signed mit bestimmter Samplerate und bestimmter Kanalzahl konvertieren und lame genau das mitteilen.
Code kann ich dir leider keinen geben weil ichs dann doch nicht gebraucht hatte, da war ein WaveHeader von dem ich nichts wusste ;-)

Grüße,
Martok