Воспроизведение видео с использованием класса Android MediaPlayer - PullRequest
4 голосов
/ 24 августа 2011

Я сохраняю видео, test.mp4, в каталоге res/raw моего проекта. У меня SurfaceView объявлено так:

  <SurfaceView android:id="@+id/surface"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center">
  </SurfaceView>

Затем, в методе onCreate () моей деятельности, у меня есть следующее:

private MediaPlayer mp;
private SurfaceView view;
private SurfaceHolder holder;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    view = (SurfaceView) findViewById (R.id.surface);
    holder = view.getHolder();
    holder.setKeepScreenOn (true); 
    mp = MediaPlayer.create(this.getBaseContext (), R.raw.test);
    mp.setDisplay (holder);
    mp.setLooping (true);
    mp.start();
}

Я не понимаю, почему он не показывает видео, даже если я установил дисплей. Я использую API 7 (2.1.1) и получаю аудио. Мне нужен интерфейс только для видео, без панели управления. Насколько я знаю, VideoView, хотя и проще, чем MediaPlayer, имеет встроенный уровень управления. Также я не вижу способа использовать VideoView на ресурсе. Если для этих двух проблем есть обходные пути, или если мое предположение о VideoView неверно, я был бы признателен, если бы мне сказали.


ОБНОВЛЕНИЕ: В настоящее время я использую класс VideoView. Мое предположение действительно было неверным в отношении автоматического использования панели управления пользовательским интерфейсом. Тем не менее, я НЕ смог воспроизвести видео, хранящиеся в res/raw, через класс MediaPlayer; всегда происходит сбой, когда я звоню prepare () или воспроизводится звук, но видео - нет. Из-за этого мой вопрос все еще стоит.

Если кто-то столкнется с моим вопросом о том, как я использовал VideoView, позвольте мне избавить вас от некоторых хлопот, связанных с поиском видео в res/raw. В следующем фрагменте предполагается, что у вас есть VideoView с идентификатором view в файле макета, main.xml:

public class generalActivity extends Activity {
    @Override
    public void onCreate (Bundle icicle) {
        super.onCreate (icicle);
        this.setContent (R.layout.main);

        // You know the that view is an instance of VideoView, so cast it as such
        VideoView v = (VideoView) this.findViewById (R.id.view);

        // This is the name of the video WITHOUT the file extension.
        // In this example, the name of the video is 'test.mp4'
        String videoName = "test"

        // You build the URI to your video here
        StringBuilder uriPathBuilder = new StringBuilder ();
        uriPathBuilder.append ("android.resource://");
        uriPathBuilder.append (this.getPackageName ());
        uriPathBuilder.append (File.separator);
        uriPathBuilder.append ("raw");
        uriPathBuilder.append (File.separator);
        uriPathBuilder.append (videoName);
        Uri uri = Uri.parse (uriPathBuilder.toString ());

        view.setVideoURI (uri);
        view.start ();
    }
}

Вот ссылка, которую я использовал в качестве ссылки для получения пути uri: ссылка

Я оставляю это открытым, потому что я спросил, могу ли я воспроизводить видео в res/raw с помощью MediaPlayer, а не VideoView. Даже если бы я заставил его работать так, как я хотел, используя VideoView, насколько я знаю, есть еще вещи, которые MediaPlayer может сделать, которые VideoView не может. Хотя я могу ошибаться, поэтому, если вам просто нужно показать видео и не нужно ничего продвинутого, я почти уверен, что VideoView будет достаточно.

О, и спасибо @Ravi за помощь.

Ответы [ 2 ]

3 голосов
/ 24 августа 2011

Я думаю, что лучшим подходом было бы использовать VideoView вместо MediaPlayer, поскольку он оборачивает плеер, поверхность и держатель для вас, если вы не видите видео в VideoView, то, возможно,видео файл не может быть воспроизведен на Android.

0 голосов
/ 24 августа 2011

Вам необходимо вызвать API setDisplay при создании поверхности.

Реализация SurfaceHolder.Callback и установка типа поверхности для push-буферов setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS)

Также, куда вы звоните setDataSource API?

Вы всегда можете взятьпосмотрите на VideoView.java , чтобы увидеть, как реализован медиаплеер:)

...