Autor Beitrag
MDX
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 595
Erhaltene Danke: 4

Windows 8.1, Linux Debian 8, Android Lollipop
Delphi, PHP, Java (Android)
BeitragVerfasst: Mi 22.05.13 04:25 
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: www1.zippyshare.com/v/51098/file.html (Zippyshare aufgrund des Flashplayers benutzt).

Hat irgendeiner die Idee woran es liegen könnte?

Hier der Code:

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."