1

http サーバーに 300 MB のビデオがあります...アプリケーションでこれらのビデオをリモートで (3G モードで) 再生するための簡単なコードを作成しようとしています - SD 保存またはローカル保存はオプションではありません。もちろん、SDK android-17 (MediaPlayerDemo_Video、VideoViewDemo...) のデモ ソースから始めましたが、3G モードではビデオが再生されません (Samsung Galaxy Nexus でテストしています)。その後、次のコードで新しい試みを行いました:

/**
 * Listing 15-4: Initializing and assigning a Surface View to a Media Player
 */
import java.io.IOException;

import mobile.dariknews.R;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.MediaController.MediaPlayerControl;

public class SurfaceViewVideoViewActivity extends Activity 
  implements SurfaceHolder.Callback {

  static final String TAG = "SurfaceViewVideoViewActivity";

  private MediaPlayer mediaPlayer;

  public void surfaceCreated(SurfaceHolder holder) { 
    try {
      // When the surface is created, assign it as the
      // display surface and assign and prepare a data 
      // source.
      mediaPlayer.setDisplay(holder);
      mediaPlayer.setDataSource("http://snimkitevi-bg.com/darik/1.MP4");
      //mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
      mediaPlayer.prepareAsync();
    } catch (IllegalArgumentException e) {
      Log.e(TAG, "Illegal Argument Exception", e);
    } catch (IllegalStateException e) {
      Log.e(TAG, "Illegal State Exception", e);
    } catch (SecurityException e) {
      Log.e(TAG, "Security Exception", e);
    } catch (Exception e) {      
      Log.e(TAG, "IO Exception", e);
    }
  }

  public void surfaceDestroyed(SurfaceHolder holder) {
    mediaPlayer.release();
  }  

  public void surfaceChanged(SurfaceHolder holder,
                             int format, int width, int height) { }


  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.surfaceviewvideoviewer);

    // Create a new Media Player.
    mediaPlayer = new MediaPlayer();

    // Get a reference to the Surface View.
    final SurfaceView surfaceView =
      (SurfaceView)findViewById(R.id.surfaceView);

    // Configure the Surface View.
    surfaceView.setKeepScreenOn(true);

    // Configure the Surface Holder and register the callback.
    SurfaceHolder holder = surfaceView.getHolder();
    holder.addCallback(this);
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    holder.setFixedSize(400, 300);

    // Connect a play button.
    Button playButton = (Button)findViewById(R.id.buttonPlay);
    playButton.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        mediaPlayer.start();        
      }
    });

    // Connect a pause button.
    Button pauseButton = (Button)findViewById(R.id.buttonPause);
    pauseButton.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        mediaPlayer.pause();        
      }
    });

    // Add a skip button.
    Button skipButton = (Button)findViewById(R.id.buttonSkip);    
    skipButton.setOnClickListener(new OnClickListener() {
      public void onClick(View v) {
        mediaPlayer.seekTo(mediaPlayer.getDuration()/2);
      }
    });

    /**
     * Listing 15-5: Controlling playback using the Media Controller
     */
    MediaController mediaController = new MediaController(this);
    mediaController.setMediaPlayer(new MediaPlayerControl() {
      public boolean canPause() {
        return true;
      }

      public boolean canSeekBackward() {
        return true;
      }

      public boolean canSeekForward() {
        return true;
      }

      public int getBufferPercentage() {
        return 0;
      }

      public int getCurrentPosition() {
        return mediaPlayer.getCurrentPosition();
      }

      public int getDuration() {
        return mediaPlayer.getDuration();
      }

      public boolean isPlaying() {
        return mediaPlayer.isPlaying();
      }

      public void pause() {
        mediaPlayer.pause();
      }

      public void seekTo(int pos) {
        mediaPlayer.seekTo(pos);
      }

      public void start() {
        mediaPlayer.start();
      }
    });    
  }
}

その後、新しい試み

import android.app.Activity;
import android.app.Application;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.widget.MediaController;
import android.widget.VideoView;

public class PlayerActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.videoplayer);
        new LoadOutbox().execute();

    }

    /**
     * Background Async Task to Load all OUTBOX messages by making HTTP Request
     * */
    class LoadOutbox extends AsyncTask<String, String, String> {
        int progressBarStatus = 0;
        private Handler progressBarHandler = new Handler();

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }

        /**
         * getting Outbox JSON
         * */
        protected String doInBackground(String... args) {
            // Building Parameters
            VideoView videoView = (VideoView) findViewById(R.id.videoView1);
            videoView.setKeepScreenOn(true);
            // Attach a Media Controller MediaController mediaController = new
            // MediaController( this); videoView.setMediaController(
            // mediaController);
            MediaController mediaController = new MediaController(
                    PlayerActivity.this);

            videoView.setMediaController(mediaController);

            Uri uri = Uri.parse("http://snimkitevi-bg.com/darik/1.MP4");
            videoView.setVideoURI(uri);
            videoView.start();

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting all products

            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                public void run() {

                }
            });

        }

    }

    public static Bitmap getLocalImageBitmap(String url) {
        return MainNewsActivities.getLocalImageBitmap(url);
    }

}

その後、MediaPlayer と VIewVideo を使用して 50 の他のテストを行いました...すべての結果は同じです - ビデオの再生が遅く、フリーズします。私のニーズは非常に単純です。ウェブサイトに大きなビデオ ファイル (mp4) があり、それらをアプリで再生したいのです。だから私はここにいます - Androidアプリケーションで大きなリモートファイルを再生するための正しい式は何ですか?

PS: もちろん GStreamer を使用しようとしましたが、このフレームワークは最後の Android 環境と互換性がありません - 私は 2 日でプレイしました...ビデオは問題ありません - Wi-Fi モードでhttp://snimkitevi-bg.com/darikを再生します/1.MP4

MediaPlayer が 3G インターネット接続でバッファリングされた大きなビデオ ファイルを高速に再生する方法について、良いアドバセス、例、チュートリアルを教えてください。

4

0 に答える 0