質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

2回答

3929閲覧

Android上で複数の動画をギャップレスに連続再生

jenga12

総合スコア14

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

2クリップ

投稿2017/05/19 16:08

個人的に使用するアプリケーションで、
タイトルにある機能を持ったアプリを作成したいと考えています。

しかし、いくつかの手法を試しましたが、
よくても0.5ミリ秒程度のギャップが発生してしまいます。

何かいい今までの改善策や手法などはないものでしょうか?

以下、今までの実験内容のメモです。

・Android MediaPlayer (Java)
ソースを指定してから、prepareメソッドを利用しなければ再生できないため
どうしてもギャップが発生してしまいます。
setNextMediaPlayer()メソッドに関しては、動画には対応していないようで、
2つの動画を同時に準備しておくのも1つのSurfaceHolderでは無理なようでした。

・Android OpenGL ES (NDK)
容量はかさみますが、連番画像ファイルを用意してテクスチャの切り替えで行いました。
読み込みとglTexImage2D関数の処理時間が長く、実用的ではなさそうです。

・Android ANativeWindowへの直接描画 (NDK)
描画元となるフレームバッファの作成に時間がかかってしまい、
実用的ではなさそうに思いました。 (単に技術力不足かもしれません)
フレームバッファを転送するのはとても速いのですが…。

・Android 公式API OpenMAX AL (NDK)
2つの動画を準備してから片方ずつ1つのSurface上で再生しましたが、
2つ目の動画がうまく再生できませんでした。
情報が少なすぎて、全て試せていないかもしれません。

また、OpenGL ES 2.0と連携し SurfaceTextureを切り替える方法も試してみましたが、 ギャップが発生してしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

とりあえずの解決策として、
動画を1つにまとめてそれぞれの動画の先頭フレームをIフレームにしておき、
MediaPlayerのseekTo()で設定したIフレームへシークすることで
代替えができそうです。

しかし、この方法では複数の動画ファイルを用いれないので、
引き続き回答の方は募集したいと思います。

投稿2017/05/21 23:49

jenga12

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

VideoViewを2つの用意して可視性を変更するのはどうですか?

投稿2017/05/19 18:22

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jenga12

2017/05/20 20:10 編集

以下のコードで試してみましたが、繋ぎ目でギャップが発生してしまいますね。 start()から再生されるまでに時間がかかってしまっているのでしょうか。 m_video1 = (VideoView)findViewById(R.id.VideoView1); m_video2 = (VideoView)findViewById(R.id.VideoView2); m_video1.setVideoPath(Environment.getExternalStorageDirectory().getPath() + "/test.ts"); m_video2.setVideoPath(Environment.getExternalStorageDirectory().getPath() + "/test.ts"); m_video1.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { m_video1.seekTo(0); m_video1.setVisibility(View.INVISIBLE); m_video2.start(); m_video2.setVisibility(View.VISIBLE); } }); m_video2.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { m_video2.seekTo(0); m_video2.setVisibility(View.INVISIBLE); m_video1.start(); m_video1.setVisibility(View.VISIBLE); } }); m_video1.start();
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問