プロジェクトへの最近の暴露、オーディオの再生があり、再生速度を切り替え、進捗状況をドラッグだけで前に見たこのレコードを簡単に見以下、最終的には、再生速度を切り替えることを試み、研究し始めていないので、プレイするためにどこかに必要回研究プロセス。
- MediaPlayerの
オーディオMediaPlayerの最初に考えたのは、Androidは、AndroidでネイティブAPIを提供することである再生6.0+(23+)MediaPlayerの再生率はsetSpeedにより変更することができます
コードでは、我々はする必要があります。
//は、音楽再生速度設定 パブリック 静的 ボイド changeplayerSpeed(フロート速度){ IF(MPlayerの== NULL ){ リターン; } IF(Build.VERSION.SDK_INT> = Build.VERSION_CODES.M){ // API 23は、上記(6.0)であります設定することで、スピード再生速度音楽を変更する のiF (mPlayer.isPlaying()){ // 音楽再生、一時停止、速度の後に設定されるように、再生していないときに、プレイしているかどうかを判断する (mPlayer.getPlaybackParamsを()mPlayer.setPlaybackParamsを。setSpeed(速度)); } 他{ mPlayer.setPlaybackParams(mPlayer.getPlaybackParams()setSpeed(速度)); mPlayer.pause(); } } そう { // 別の方法で、追加に続いて見出さ良い方法が必要とされる処理前Android6.0 } }
実際の実装プロセス、私はあなたがこれを実行した後、消音演奏は、スイッチの再生速度を達成していなかっただけでなく、テスター名誉V9の手を見つけ、プレーヤーを復元することはできません。無力な、彼は別の方法を見つけなければなりませんでした。
- PLMediaPlayer
PLDroidPlayer 7頭の牛のSDK、APIのセットを提供し PLMediaPlayer
、公式のAndroidと、基本的なさまざまな機能を実現するために、メディアプレーヤーをインタフェース MediaPlayer
デザインは同じままでした。
コードのキー行
プライベート PLOnPreparedListener mOnPreparedListener = 新しいPLOnPreparedListener(){ @Override 公共 のボイド(onPrepared int型preparedTime){ (TAG、Log.i "事前に用意しました!" ); mMediaPlayer.start();
//设置播放速率为2倍 mMediaPlayer.setPlaySpeed( 2.0f ); mIsStopped = 偽; } }。
実際の実装通常の再生速度を切り替えるプロセス、が、高い確率seekTo操作が失敗したが、それではあきらめて、まだ問題は、問題を見つける方法をgithubの上でそれをチェックアウト。
- ijkPlayer
ijkplayer局B APIを統合しやすい軽量のAndroid ffplay / iOS搭載ビデオプレーヤー、クロスプラットフォームの機能、である;構成は、インストールパッケージの大きさを制御することが容易に切断することができる構築。
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER、 "soundtouch"、1);
ijkMediaPlayer.setSpeed(2.0f)。
APIと使用同様のメディアプレーヤは、キーコード1行だけです。
実際の実装プロセスは、通常、通常の再生速度スイッチ(のみストレス0.5倍遅い時間の存在への切り替えを)seekToが、少しはijkplayerをサポートするために、ソースコードをコンパイルする必要があります検索、URLのオーディオファイルを再生httpsで始めることはできませんHTTPSは、その後、あきらめます。
- ExoPlayer
最終的な選択は、達成するためのAPIと同様のMediaPlayerのGoogleのexoPlayerですが、また、いくつかの違い、キーコードは、再生制御部の下に掲載されています。
パッケージcom.weex.app.media。 輸入android.content.Context; 輸入android.net.Uri; 輸入com.google.android.exoplayer2.ExoPlayer。 輸入com.google.android.exoplayer2.ExoPlayerFactory。 輸入com.google.android.exoplayer2.PlaybackParameters。 輸入com.google.android.exoplayer2.Player。 輸入com.google.android.exoplayer2.SimpleExoPlayer。 輸入com.google.android.exoplayer2.source.ExtractorMediaSource。 輸入com.google.android.exoplayer2.source.MediaSource。 輸入com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection。 インポートcom.google.android.exoplayer2.trackselection.DefaultTrackSelector; 輸入com.google.android.exoplayer2.trackselection.TrackSelection。 輸入com.google.android.exoplayer2.trackselection.TrackSelector。 輸入com.google.android.exoplayer2.upstream.BandwidthMeter。 輸入com.google.android.exoplayer2.upstream.DataSource。 輸入com.google.android.exoplayer2.upstream.DefaultBandwidthMeter。 輸入com.google.android.exoplayer2.upstream.DefaultDataSourceFactory。 輸入com.google.android.exoplayer2.util.Util。 インポートのjava.io.File; パブリック クラスAudioPlayerManager { プライベート 静的 最終的な文字列タグ=「AudioPlayerManager」。 パブリック 静的フロート[] speedArray = 新しいフロート[] {1.0F、1.25f、1.75f、0.5F、0.75F }。 プライベート 静的AudioPlayerManagerインスタンス。 プライベートコンテキストコンテキスト。 プライベートSimpleExoPlayer MediaPlayerの。 プライベートDataSource.Factory dataSourceFactory。 プライベートAudioPlayerManager(コンテキスト・コンテキスト){ この .context = 文脈。 createPlayer(); } パブリック 静的AudioPlayerManagerのgetInstance(コンテキスト・コンテキスト){ 同期(AudioPlayerManager クラス){ IF(例えば== NULL ){ インスタンス = 新しい新しいAudioPlayerManager(コンテキスト); } } 戻りインスタンス; } 公共ExoPlayer getMediaPlayer(){ 戻りメディアプレーヤを; } 再生URL設定// パブリック ボイドsetAudioUrlを(文字列audioUrl ){ 試み{ // これはMediaSourceの中で再生するメディアの代表である = MediaSourceのMediaSourceの新しい新ExtractorMediaSource.Factory(DataSourceFactory) .createMediaSource(Uri.parse(audioUrl)); mediaPlayer.prepare(MediaSourceの); mediaPlayer.setPlayWhenReady(偽の); } キャッチ(例外E){ e.printStackTrace(); } } //再生を設定しますファイルの 公共 のボイドsetAudioFile(ファイルファイル){ 試み{ // これは代表が再生MediaSourceのだろうですが、メディア MediaSourceのMediaSourceを= 新しい新ExtractorMediaSource.Factory(DataSourceFactory) .createMediaSource(Uri.fromFile(ファイル)); mediaPlayer.prepare(MediaSourceの)。 mediaPlayer.setPlayWhenReady(偽); } キャッチ(例外e){ e.printStackTrace(); } } //开始播放 公共 ボイド開始(){ mediaPlayer.setPlayWhenReady(真)。 } //判断是否是播放状态 パブリック ブールisPlaying(){ int型 playbackState = mediaPlayer.getPlaybackState()。 もし(playbackState == SimpleExoPlayer.STATE_READY && mediaPlayer.getPlayWhenReady()){ リターン 真。 } を返す 偽。 } //播放、带回调事件 公共 ボイドplayWithCompletionListener(文字列のURL、Player.EventListenerリスナー){ 場合(聞き手=!ヌル){ mediaPlayer.addListener(リスナー)。 } であれば(url.startsWith( "HTTP" )){ setAudioUrl(URL)。 } 他{ setAudioFile(新しいファイル(URL)); } mediaPlayer.setPlayWhenReady(真)。 } //播放または暂停 公衆 ボイドplayOrPause(){ IF {(isPlaying()) (mediaPlayer.setPlayWhenReady falseに;) } 他{ (mediaPlayer.setPlayWhenReady 真の); } } 再生速度切り替え// 公共 のボイド(switchSpeedをint型speedIndex){ // API 23は、提供することで、上記(6.0)であります速度は、音楽の再生速度を変更する 場合(isPlaying()){ // 再生していないときに決意は、再生されている場合に、速度に設定した後、音楽再生の一時停止 getMediaPlayer()setPlaybackParameters(新しい新しいPlaybackParameters(speedArray [speedIndexを])); } {他に 。getMediaPlayer()setPlaybackParameters(新しいPlaybackParameters(speedArray [speedIndex]))。 getMediaPlayer()setPlayWhenReady(偽); } } //停止播放 公共 ボイド停止(ブールリセット){ 場合(MediaPlayerの!= NULL ){ mediaPlayer.stop(リセット)。 } } //释放资源 公共 ボイドリリース(){ 場合(!MediaPlayerの= ヌル){ mediaPlayer.release(); } } //新しいプレーヤーを作成 プライベートが 無効createPlayerを(){ // 帯域幅作成 BandwidthMeter bandwidthMeter = 新新DefaultBandwidthMeter(); // トラック選択機能作成 TrackSelection.Factory videoTrackSelectionFactory = 新新AdaptiveTrackSelection.Factory(bandwidthMeterを); //は、トラック選択のインスタンスを作成 TrackSelectorを= trackSelector 新しい新DefaultTrackSelector(videoTrackSelectionFactory); // 。ステップ2は、プレイヤー作成した メディアプレーヤ= ExoPlayerFactory.newSimpleInstance(コンテキスト、trackSelectorを); //は、マルチメディアデータをダウンロードするためにそれを通してDataSourceオブジェクトを作成します dataSourceFactory = 新しいDefaultDataSourceFactory(コンテキスト、 Util.getUserAgent(文脈、 "ローダ" ))。 } }
実際のセルフテストプロセス、通常の性能、再生速度を切り替える、そこ重(チョン)音のない場合はありませんが、以下の装置6.0でテストされていません。