【问题标题】:How to play a video file in android?如何在android中播放视频文件?
【发布时间】:2020-04-08 18:26:44
【问题描述】:

我将视频 MP4 放置到我的域空间中。我有它的公共 URL,现在我想在我的 android 应用程序中播放它;但不知道我该怎么做。我使用了以下不起作用的代码。轨道控制器正在移动,但我在屏幕上看不到任何视频。

public class MPlayer extends Activity{
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.playvideo);
    VideoView videoView = new VideoView(MPlayer.this);
    videoView.setMediaController(new MediaController(this));
    videoView.setVideoURI(Uri.parse("http://www.semanticdevlab.com/abc.mp4"));
    videoView.requestFocus();
    videoView.start();
    LinearLayout l = (LinearLayout)findViewById(R.id.mplayer);
    l.addView(videoView);
}
}

【问题讨论】:

  • 您的文件可能与安卓相当有限的解码器不兼容。将其复制到 sdcard 并尝试使用内置视频应用程序在本地播放。获得音频但没有视频是这种情况的常见症状。如果这不起作用,您的程序可能无法流式传输,除非您使用软件解码(这在大多数设备上可能无法令人满意)
  • 查看此链接下载并播放视频here!

标签: android video playback


【解决方案1】:

VideoView 类可以从各种来源(例如资源或内容提供商)加载图像,负责从视频中计算其测量值,以便可以在任何布局管理器中使用它,并提供各种显示选项,例如缩放和着色。

代码:

videoView = (VideoView)findViewById(R.id.ViewVideo);
videoView.setVideoURI(Uri.parse(“android.resource://” + getPackageName() +”/”+R.raw.video));
videoView.setMediaController(new MediaController(this));
videoView.requestFocus();
videoView.start();

如果您想查看源代码:Play video file using VideoView in Android

【讨论】:

  • 在我输入此评论时,此处提供的链接不起作用...这对我的研究会有所帮助...
  • 对于公共 URL,我使用了 videoView.setVideoPath(path);
【解决方案2】:

大多数时候,我使用以下代码:

MediaPlayer mp = new MediaPlayer();
    mp.setDataSource(PATH_TO_FILE);
    mp.prepare();
    mp.start();

欲了解更多信息,请查看此页面:http://developer.android.com/guide/topics/media/index.htmlhttp://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.html

【讨论】:

  • 我试过这个。但出现错误:AudioTrack 获取缓冲区超时 Audio Flinger 写入阻塞 70 秒
【解决方案3】:

我认为这可能会帮助您找到一些解决方案。

mp=new MediaPlayer();                    
mp.setDataSource(path);
mp.setScreenOnWhilePlaying(true);
mp.setDisplay(holder);
mp.prepare();
mp.start();

【讨论】:

    【解决方案4】:

    如果您在模拟器中尝试此操作,则可能必须在真实设备中尝试,因为有时我也会遇到同样的问题。我将无法在模拟器中观看视频,但视频将在手机中播放而不会出现任何问题。问题是,我认为是模拟器,而不是你的代码。

    【讨论】:

      【解决方案5】:

      这就是我在项目中播放网络视频文件的方式

      需要 Kotlin、AndroidX

      在文件缓冲时显示加载对话框,然后开始播放:

      private fun playVideo(videopath: String) {
          Log.e("Playing Video File: ", "" + videopath);
          try {
              //Show Loader
              val builder: AlertDialog.Builder = AlertDialog.Builder(this@ScreenCaptureImageActivity);
              builder.setCancelable(false); // if you want user to wait for some process to finish,
              builder.setView(R.layout.layout_loading_dialog);
              progressDialog = builder.create();
      
              //add Controller
              val mediaController = MediaController(this@ScreenCaptureImageActivity);
              videoView.setMediaController(mediaController)
              //Add URI
      
              //Uncomment to play from local path
              //videoView.setVideoURI(Uri.parse(videopath))
      
              //Example Play from Internet
              videoView.setVideoPath("http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4")
      
              videoView.setOnPreparedListener {
                  progressDialog!!.dismiss();
                  //Start Playback
                  videoView.start()
                  Log.e(TAG, "Video Started");
              }
          } catch (e: Exception) {
              progressDialog!!.dismiss();
             Log.e(TAG, "Video Play Error :" + e.localizedMessage);
          }
      }
      

      加载器 XML

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="horizontal"
          android:padding="20dp">
          <ProgressBar
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_weight="1" />
      
          <TextView
              android:layout_width="0dp"
              android:layout_height="match_parent"
              android:layout_weight="4"
              android:gravity="center"
              android:text="Please wait! This may take a moment." />
      </LinearLayout>
      

      **对于网络访问,在清单中添加网络配置,来自 Android P 是必需的**

       <application
              ...
              android:networkSecurityConfig="@xml/network_security_config"
              >
      

      在 res/xml 中添加 network_security_config.xml

      <?xml version="1.0" encoding="utf-8"?>
      <network-security-config>
          <base-config cleartextTrafficPermitted="true">
              <trust-anchors>
                  <certificates src="system" />
              </trust-anchors>
          </base-config>
      </network-security-config>
      

      【讨论】:

        【解决方案6】:

        您应该在onResume 中执行此操作,因为在onCreateVideoView 不知道其大小并且无法创建正确的表面来显示视频。

        public class MPlayer extends Activity{
        
        VideoView videoView;
        
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.playvideo);
            videoView = new VideoView(MPlayer.this);
            videoView.setMediaController(new MediaController(this));
            LinearLayout l = (LinearLayout)findViewById(R.id.mplayer);
            l.addView(videoView);
           }
        
            @Override
            protected void onResume() {
                super.onResume();
        videoView.setVideoURI(Uri.parse("http://www.semanticdevlab.com/abc.mp4"));
                videoView.start();
        }
        

        【讨论】:

          猜你喜欢
          • 2012-11-04
          • 2011-11-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-29
          • 1970-01-01
          • 2011-07-06
          • 2012-11-28
          • 2015-01-31
          相关资源
          最近更新 更多