【问题标题】:How to play .mp4 video as a background video in Android?如何在 Android 中将 .mp4 视频作为背景视频播放?
【发布时间】:2017-06-07 07:36:36
【问题描述】:

我看过很多教程,但有些地方出了问题。我有简单的 mainactivity,并且它的布局上有一个 VideoView。我从 youtube 下载了一个视频,因为 .mp4 文件大小约为 10 mb。我在 youtube 上找到了一个很棒的关于 videoview 的示例,如下链接所示。

https://www.youtube.com/watch?v=tPeDn18FrGY&t=75s

公共类 MainActivity 扩展 AppCompatActivity {

private VideoView bgVideo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bgVideo=(VideoView) findViewById(R.id.bg_videoview);

        Uri uri = Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.bgvideo);

        bgVideo.setVideoURI(uri);
        bgVideo.start();

        bgVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                mp.setLooping(true);
            }
        });
    }
}

我使用 genymotion 模拟器。当我运行应用程序时,出现“无法播放”错误。在 android 监视器上是这样的。

06-07 03:16:28.675 2146-2146/com.sample E/MediaPlayer: Error (1,-2147483648)
06-07 03:16:28.675 2146-2146/com.sample D/VideoView: Error: 1,-2147483648
06-07 03:16:28.692 2146-2146/com.sample E/MediaPlayer: Error (1,-2147483648)
06-07 03:16:28.692 2146-2146/com.sample D/VideoView: Error: 1,-2147483648
06-07 03:16:28.709 2146-2146/com.sample E/MediaPlayer: Error (1,-2147483648)
06-07 03:16:28.709 2146-2146/com.sample D/VideoView: Error: 1,-2147483648
06-07 03:16:28.742 2146-2146/com.sample E/MediaPlayer: Error (1,-32)
06-07 03:16:28.742 2146-2146/com.sample D/VideoView: Error: 1,-32
06-07 03:16:28.758 2146-2146/com.sample E/MediaPlayer: Error (1,-38)
06-07 03:16:28.758 2146-2146/com.sample D/VideoView: Error: 1,-38
06-07 03:16:29.526 2146-2146/com.sample I/Choreographer: Skipped 44 frames!  The application may be doing too much work on its main thread.

我该如何解决?

【问题讨论】:

  • 检查this answer
  • 尝试在设备而不是模拟器上运行

标签: java android


【解决方案1】:

您可以使用MediaPlayer 对象并在一项服务中进行游戏。这是示例代码:

public class Mp3PlayerService extends Service implements
        MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnSeekCompleteListener {

    /** Android Built-in Media Player */
    public MediaPlayer player;

    /** Binder for Mp3 Service */
    private final IBinder iBinder = new Mp3PlayerService.BackgroundAudioServiceBinder();

    @Override
    public void onCreate() {
        super.onCreate();
        player = new MediaPlayer();
        player.setOnCompletionListener(this);
        player = new MediaPlayer();
        try {
          playSongLocal();
          playSongNetwork();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
    }


    private void playsongLocal() {
        AssetFileDescriptor afd;
        player.reset();
        try {
            LogUtils.LOGE(TAG, "playing aaa.mp3");
            afd = getApplicationContext().getAssets().openFd("aaa.mp3");
            player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
            player.prepareAsync();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void playsongNetwork() {
        player.reset();
        try {
            player.setDataSource(networkUrlLink);
            player.prepareAsync();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return iBinder;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    public void onDestroy() {
        if (player.isPlaying()) {
            player.stop();
        }
        player.release();
    }

    /** return itself when beeing asked */
    public class BackgroundAudioServiceBinder extends Binder {
        public Mp3PlayerService getService() {
            return Mp3PlayerService.this;
        }
    }

【讨论】:

    【解决方案2】:

    你需要在onPrepare里面启动bgVideo.start

    bgVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.setLooping(true);
                    bgVideo.start();
                }
            });
    

    【讨论】:

      【解决方案3】:

      您是否尝试在 onPreparedListener 之后启动 bgVideo?

      bgVideo.setVideoURI(uri);
      
              bgVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                  @Override
                  public void onPrepared(MediaPlayer mp) {
                      mp.setLooping(true);
                  }
              });
      
              bgVideo.start();
      

      还有你使用的是什么 API 版本?

      【讨论】:

      • 我使用 android 7.0 API 24。
      • @Timosis 您是否尝试在 onPreparedListener 之后使用 video.start?
      • 是的,但结果是一样的。
      • 我抓住了这个。在 Android 4.1 之前,方法 android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) 会错误地覆盖包- android.graphics.drawable.Drawable 中的私有方法
      • 你尝试过其他视频吗?
      【解决方案4】:

      试试这个代码:

       try {
                  // Start the MediaController
                  MediaController mediacontroller = new MediaController(
                          MainActivity.this);
                  mediacontroller.setAnchorView(bgVideo);
                  // Get the URL from String VideoURL
                  Uri uri = Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.bgvideo);
      
                  bgVideo.setMediaController(mediacontroller);
                  bgVideo.setVideoURI(uri);
      
              } catch (Exception e) {
                  Log.e("Error", e.getMessage());
                  e.printStackTrace();
              }
      bgVideo.requestFocus();
      
          bgVideo.setOnPreparedListener(new OnPreparedListener() {
      
                      public void onPrepared(MediaPlayer mp) {
                          mp.setLooping(true);
                          bgVideo.start();
                      }
                  });
      

      【讨论】:

      • 对不起结果一样!
      猜你喜欢
      • 2016-02-26
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2011-11-01
      • 2012-01-06
      • 2013-06-28
      相关资源
      最近更新 更多