音频seekTo的实现
来源:互联网 发布:日本经济数据统计局 编辑:程序博客网 时间:2024/04/30 11:38
1.音频的seekTo最终是在AudioPlayer类中实现的,AudioPlayer::seekTo函数
status_t AudioPlayer::seekTo(int64_t time_us) { Mutex::Autolock autoLock(mLock); mSeeking = true;// 设置seek标志为true mReachedEOS = false;// 可以seek,说明还未到文件末尾,则结束标识设置为false mSeekTimeUs = time_us;// seek到的时间点 if (mAudioSink != NULL) { // mAudioSink优先,mAudioSink内部会create AudioTrack并注册callback mAudioSink->flush(); } else { mAudioTrack->flush(); } return OK;}
2. buffer的填充是在AudioPlayer::AudioSinkCallback函数中调用AudioPlayer::fillBuffer来填充的,而fillBuffer又是通过调用mSource->read(&mInputBuffer, &options);来实现的,read会调用音频类型对应MediaSource的实现类来实现读取seekto位置的数据,例如MP3音频,如果是软解的话,就会调用MP3Source::read方法,读取seekto位置的数据填充buffer。
seek到的位置被设置到MediaSource::ReadOptions对象options中,通过以下方法设置。
options.setSeekTo(mSeekTimeUs);
而options又作为mSource->read的参数,被传递到MP3Source::read函数中,赋值给MP3Source的成员变量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的分析。
- 音频seekTo的实现
- mediaPlayer的seekto方法
- android--mediaplayer的seekTo用法
- seekTo()的相关_android里的mediaplayer
- 关于Android seekTo的一点记录
- SeekBar与MediaPlayer(生命周期)的seekTo()问题
- Android开发——MediaPlayer的seekto分析
- 【总结】关于MediaPlayer中的getCurrentPosition()和seekTo(int)的总结
- 关于MediaPlayer中的getCurrentPosition()和seekTo(int)的总结
- 关于Android VideoView seekTo不准确的问题
- MediaExtractor的seekTo方法精确定位到指定帧
- 关于MediaPlayer中的getCurrentPosition()和seekTo(int)的总结
- 实习入职第十三天:MediaPlayer的seekTo函数
- 实习第十四天:seekTo这种用法是错误的
- Android中的mediaplayer的seekto()方法用法
- c#实现的音频入库
- 实现音频功能的接口
- 音频重采样的实现
- android控件25 Intent
- android导入项目常见问题解决
- Cassandra中的二级索引
- 使用Oracle Developer Tools For Visual Studio .NET
- 粗心的下场
- 音频seekTo的实现
- linux内核介绍:
- android布局单位px,dip
- Get Started With Continuous Integration For Your .NET (C#) Projects - Build Your Project
- Windows 7下桌面IE图标显示与修复的完美解决方法
- Cross Toolchain-交叉编译工具链
- DCI: 与领域驱动设计,四色建模的关系
- H264 NAL层解析
- 正则表达式