Hvorfor er det nødvendigt at bruge strenge i de beregninger. Meget forvirrende - generelt en meget rodet funktion hvor man på parameteren ikke kan se hvilken værdi der sendes. Hvis nu du skrev aVorbisRatio eller lignende så var man ikke i tvivl.
I øvrigt kan du lave "QualityB := min(QualityB,10)" i stedet for din "if then" (jeg kan godt lide one-lineres)
Optimerede lidt på din funktion og nåede frem til dette her:
ja jeg ved godt det er noget rod (flovt) det jeg har arbejdet ud fra er en opensource cd ripper kaldet CDex, så det er nok ikke så underligt at min oversættelse af en stump kode blev en gang gylle :(
koden jeg har fokuseret ud fra er som følgende: void CEncoderVorbidDllDlg::UpdateQualityControlValue()
/* ** Copyright (C) 1999 - 2002 Albert L. Faber ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
for (int i=1;i<nItems;i++) { if (min_br==oggBitrates[i]) { m_MinBitrate.SetCurSel(i); } if (nom_br==oggBitrates[i]) { m_Bitrate.SetCurSel(i); } if (max_br==oggBitrates[i]) { m_MaxBitrate.SetCurSel(i); } }
}
void CEncoderVorbidDllDlg::SetControls(CEncoder* pEncoder) { INT nMode = pEncoder->GetMode();
// Set control items based in pEncoder information m_bEncDuringRead=pEncoder->GetOnTheFlyEncoding();
Joee. Det kan jeg da og det ser da også ud til du stort set har porteret rutinen - men skal det være 500 på toppen og ikke sådan som min funktion skriver, 540?
Man kan jo hacke det lidt og sige at hvis aVorbisRatio = 10 så er bitraten 500, alle andre steder kan man så beregne den. Det er ikke kønt. Uden at kende en fløjtende fjært til Vorbis ellers, så vil jeg da synes at 540 er det rigtige resultat.
Han slår simpelthen op i konstant som er en matrice, så QualityNominalBitrateRelation[x][1] slår op i den sidste kolonne, dvs. tallene 45, 64, 80, 96 ...). Umiddelbart bruges den første kolonne ikke - ser ud til at være med af informative grunde.
I Delphi kan du lave det samme (gider ikke skrive det lange navn). Som nævnt tidligere behøver du tilsyneladende ikke den første kolonne:
function TfrmMain.CalcVorbisBitrate2(const aVorbisQuality: Double): String; const QNBR : array[-1..10] of integer = (45,64,80,96,112,128,160,192,224,256,320,500); var dMultA : double; dMultB : double; nQualityA : integer; nQualityB : integer; dEstBitrate : double; begin nQualityA := floor(aVorbisQuality); nQualityB := min(nQualityA + 1,10);
dMultB := min(aVorbisQuality,0.0); // Et gæt for der er fejl i den oprindelige kode dMultA := 1.0 - dMultB;
>>hrc: jeg har lavet en lille rettelse i koden der nu har fået det til at virke ultima perfectus :D jeg vil endnu end gang takke for din indsats og ikke minst for din tolmodighed for mine spørgsmål. her er så det endelige resultat: function TConfigOutputDlg.CalcVorbisBitrate(aVorbisQuality: Double): String; const QNBR : array[-1..10] of integer = (45, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 500); var dMultA : double; dMultB : double; nQualityA : integer; nQualityB : integer; dEstBitrate : double; begin nQualityA := floor(aVorbisQuality); nQualityB := min(nQualityA + 1,10); if (aVorbisQuality > 0) then dMultB := aVorbisQuality - nQualityA else dMultB := aVorbisQuality - nQualityA; dMultA := 1.0 - dMultB; dEstBitrate := (dMultA * QNBR[nQualityA]) + (dMultB * QNBR[nQualityB]); Result := ' (~' + FloatToStr(Round(dEstBitrate)) + ')'; end;
/psycosoft-funware
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.