0

次のコードを機能させるのに問題があります。

soxr_error_t err;
soxr_datatype_t itype = SOXR_INT16_I;
soxr_datatype_t otype = SOXR_INT16_I;
soxr_io_spec_t iospec = soxr_io_spec(itype, otype);
size_t idone = 0;
size_t odone = 0;
size_t const olen = (size_t)((speed * 44100) * (numframes * 2) / (44100 + (44100 * speed)) + .5);

// Do the resampling
short* output = new short[numframes * 2];
soxr_t sox = soxr_create(44100, 44100 * speed, 2, &err, &iospec, NULL, NULL);
if (!err)
    soxr_process(sox, input, numframes * 2, &idone, output, olen * 2, &odone);
soxr_delete(sox);

PCM ショート データ (inputオブジェクト)が入ってくるのでspeed、ご覧のように元のサンプルレートを掛けた値にリサンプリングする必要があります (44100 が標準です)。またnumframes、送信したデータのブロックからのフレーム数です (これはステレオです)

問題は、メソッドを実行するとアプリケーションがクラッシュすることsoxr_process()です。メソッドからのエラーはないように見えるsoxr_create()ので、それが何であるかはよくわかりません。

私は現在、サウンドを高速化しようとしているだけなので、リサンプル後にすべてを保持するのに十分な大きさの出力バッファをオリジナルと同じ大きさにしました。

どうすればこの問題を解決できますか? soxr_process()メソッドに間違った値を指定しましたか?

編集:
私もこの方法で試しました:

soxr_oneshot(4410, 44100 * speed, 2, input, numframes * 2, &idone, output, outputFrames * 2, &odone, &iospec, NULL, NULL);

しかし、それも Access Violation エラーをスローします。

前もって感謝します!

4

1 に答える 1

0

このコードを使用して修正できました:

// Check the number of frames needed to fill extra or send to the next block
int outputFrames = numframes * speed;
int extraReadNeeded = numframes - outputFrames;

soxr_error_t err;

soxr_datatype_t itype = SOXR_INT16_I;
soxr_datatype_t otype = SOXR_INT16_I;
soxr_io_spec_t iospec = soxr_io_spec(itype, otype);

size_t idone = 0;
size_t odone = 0;

size_t const olen = (size_t)((speed * 44100) * (numframes * 2) / (44100 + (44100 * speed)) + .5);

// Do the resampling
short* output = new short[outputFrames * 4];
soxr_t sox = soxr_create(44100, 44100 * speed, 2, &err, &iospec, NULL, NULL);
if (!err)
    err = soxr_process(sox, input, numframes * 2, &idone, output, outputFrames, &odone);
soxr_delete(sox);

期待したほど出力が大きくなかったようです。ただし、ポインターにどのように書き込まれるかはよくわかりません。今のところ修正されています。

誰かが何か指摘があれば、遠慮なく間違いを指摘してください

于 2015-03-02T14:04:03.237 に答える