音訊seekTo的實現

2021-09-01 01:26:08 字數 1185 閱讀 5924

1.音訊的seekto最終是在audioplayer類中實現的,audioplayer::seekto函式

status_t audioplayer::seekto(int64_t time_us) else return ok; }

2. buffer的填充是在audioplayer::audiosinkcallback函式中呼叫audioplayer::fillbuffer來填充的,而fillbuffer又是通過呼叫msource->read(&minputbuffer, &options);來實現的,read會呼叫音訊型別對應mediasource的實現類來實現讀取seekto位置的資料,例如***音訊,如果是軟解的話,就會呼叫***source::read方法,讀取seekto位置的資料填充buffer。

seek到的位置被設定到mediasource::readoptions物件options中,通過以下方法設定。

options.setseekto(mseektimeus);

而options又作為msource->read的引數,被傳遞到***source::read函式中,賦值給***source的成員變數mcurrenttimeus。當讀完一幀資料後,mcurrenttimeus的值就增加了一幀的時長。計算方法如下:

mcurrenttimeus += frame_size * 8000ll / bitrate;

3.audiosinkcallback函式是在audioplayer::start函式中註冊的。

if (maudiosink.get() != null) { status_t err = maudiosink->open( msamplerate, numchannels, audiosystem::pcm_16_bit, default_audiosink_buffercount, &audioplayer::audiosinkcallback, this);

4.在fillbuffer函式中,當info_format_changed時,又重新註冊了audiosinkcallback函式。

status_t err = maudiosink->open( msamplerate, numchannels, audiosystem::pcm_16_bit, default_audiosink_buffercount, &audioplayer::audiosinkcallback, this);

以上是對音訊seekto的分析。

音訊重取樣的實現

在聲紋識別中,為了滿足對不同取樣率的要求,常需要對語音進行重取樣。重取樣即將原始的取樣頻率變換為新的取樣頻率以適應不同取樣率的要求。實現重取樣的傳統方法有三種 一是若原模擬訊號x t 可以再生,或是已記錄下來,那麼可以進行重新取樣 二是將 x n 通過數模轉換 d a變成模擬訊號 x t 對x t ...

web audio api 實現音訊的視覺化

使用web audio api的基本流程 1.建立乙個audiocontext物件 audiocontext是web audio api的第一步也是最不可或缺的,類似於canvas的getcontext const audiocontext window.audiocontext window.we...

音訊數字水印的演算法實現(4)

本演算法基於復倒譜變換實現了水印的嵌入,利用倒譜變換的性質實現了盲提取,同時對水印進行了置亂處理。利用了同態分析,把非線性問題轉化為線性問題來處理,通過傅利葉變換和逆變換實現了卷積訊號和線性訊號的轉變。復倒譜係數的不相關性很大,能量大小接近0 常見的數字攻擊對復倒譜係數的影響比較小 復倒譜變換的水印...