Einzelnen Beitrag anzeigen

Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#1

Generelle frage zu TFileStream

  Alt 22. Dez 2012, 10:32
hi

ich trete auf einer stelle und komme nicht weiter. das heißt ich weiß nicht was die bessere lösung für mein problem ist.
ich arbeite an einem Skype - Sound Recorder. das klappt auch ziemlich gut.
das problem das ich habe ist, ich schicke den Sound/Mix durch verschieden Encoder wie (lame_enc.dll, libFLAC.dll,...)
und zeichne den sound direkt per TFileStream auf. jetzt möchte ich die aufnahme Schneiden Bzw. auf 5 MB per File Limitieren
wenn möglich Bit genau. das wäre awesome wenn mir da jemand weiterhelfen könnte.


eins der probleme ist, verschiedene encoder schreiben die daten in verschieden grosse blöcke.

Delphi-Quellcode:
function TEncoder_MP3.Encoder_Write(Buf : Pointer; Len : Cardinal) : Boolean;
var
 BytesRead : Int64;
 OutSize : LongWord;
 beError : BE_ERR;
 wres : longint;
begin
  Result:= true;

 if FAbort then
  begin
   Result:= false
   exit;
  end;


  if Len <> 0 then
   begin
     beError := beEncodeChunk(Stream, Len div 2, Buf, mp3buf, OutSize);
    if (beError <> BE_ERR_SUCCESSFUL) then
     raise FLameException.Create('beEncodeChunk failed. ' + IntToStr(beError));

     FFileStream.Write(mp3buf^, OutSize); //<< auf 5 MB per File Limitieren
   end
  else
   begin
    Result:= false;
    exit;
   end;
end;



(************ Conver 32 Bit Floating-point to 16 Bit integer LE/BE ************)

procedure DSP32f_16bitLE(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: Pointer); stdcall;
var
  src : array of Single;
  dst : array of SmallInt;
  i : Integer;
  SaveValue : Integer;
begin
   SetLength(src, length);
   SetLength(dst, length div 2);

   move(buffer^, src[0], length);

  for I := 0 to (length div 4) do
   begin
    SaveValue := Trunc(src[I] * 32768);
    SaveValue := Clip_16(SaveValue);
    dst[I] := SmallInt(SaveValue);
   end;

  FMp3Encoder.Encoder_Write(@dst[0], length div 2)
end;



 BASS_ChannelSetDSP(Chan_Mixer, @DSP32f_16bitLE, Pointer(Self), -100);

thx
  Mit Zitat antworten Zitat