5

audioQueue で音楽の合計時間を取得する方法。私は使っている

NSTimeInterval AQPlayer::getCurrentTime()
{
    NSTimeInterval timeInterval = 0.0;

    AudioQueueTimelineRef timeLine;
    OSStatus status = AudioQueueCreateTimeline(mQueue, &timeLine);
    if(status == noErr)
    {
        AudioTimeStamp timeStamp;
        AudioQueueGetCurrentTime(mQueue, timeLine, &timeStamp, NULL);
        timeInterval = timeStamp.mSampleTime;
    }

    return timeInterval;
}

AudioQueueGetCurrentTime(mQueue, timeLine, &timeStamp, NULL); 現在の再生時間を取得するために、有効な大きな値と、音楽ファイルの長さを取得する方法を示します。

4

3 に答える 3

8

今後の参考のために、チャンダンのコードをわずかに変更して、秒単位で正しい時間を取得しています。

int AQPlayer::GetCurrentTime() {
    int timeInterval = 0;
    AudioQueueTimelineRef timeLine;
    OSStatus status = AudioQueueCreateTimeline(mQueue, &timeLine);
    if(status == noErr) {
        AudioTimeStamp timeStamp;
        AudioQueueGetCurrentTime(mQueue, timeLine, &timeStamp, NULL);
        timeInterval = timeStamp.mSampleTime / mDataFormat.mSampleRate; // modified
    }
    return timeInterval;
}
于 2010-11-09T05:14:58.483 に答える
2

AudioQueueGetCurrentTime(mQueue, timeLine, &timeStamp, NULL); 現在の再生時間を取得するために、有効な大きな値が得られます

おそらくですが、それはあなたが考えていることではありません。秒単位ではありません。ドキュメントはそれ何であるかを実際には述べていませんが、グーグルで調べてみると、何らかの理由でフレーム内にあるようです. (一例として、このテクニカルノートには、フレームとして扱うスニペットが含まれています。) サンプル レートで割ったり、(ソースの) フレーム レートで割ったりして、どちらが適切な数値になるかを確認してください。

音楽ファイルの長さを取得する方法。

1つもありません。オーディオ キューとは、再生または録音するオーディオ サンプルのキューです。キューの長さは、キューに入れることができるサンプルの数だけです。キューは、それらのソースの長さが有限であっても、キューに供給される可能性のあるものの長さを知りません。

オーディオ キューは、ユーザーが作成した関数を呼び出して、ユーザーからオーディオ サンプルを取得します。関数がサンプルを取得する場所 (AudioFile など) から長さを取得する必要があります。自分でサンプルを生成している場合 (トーンまたはノイズ ジェネレーターのように)、長さはあなた次第です。

于 2010-08-03T11:55:53.620 に答える
1
NSTimeInterval  AQPlayer::getTotalDuration()
{   
    UInt64 nPackets;
    UInt32 propsize = sizeof(nPackets);

    XThrowIfError (AudioFileGetProperty(mAudioFile, kAudioFilePropertyAudioDataPacketCount, &propsize, &nPackets), "kAudioFilePropertyAudioDataPacketCount");
    Float64 fileDuration = (nPackets * mDataFormat.mFramesPerPacket) / mDataFormat.mSampleRate;

    return fileDuration;
}
于 2010-08-04T06:08:36.383 に答える