在安卓系统中如何播放视频文件?

16

我将视频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);
}
}

2
你的文件可能与Android相对有限的解码器不兼容。将其复制到SD卡上,并尝试使用内置视频应用程序在本地播放。只能听到声音而看不到视频是常见的症状。如果这样还不行,除非使用软件解码(但在大多数设备上可能不令人满意),否则你的程序可能无法流式传输它。 - Chris Stratton
请点击此链接下载并播放视频这里 - Soni_ji
6个回答

17

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();

如果您想查看源代码:在Android中使用VideoView播放视频文件


5
目前我正在输入这条评论,这里提供的链接无法使用……这本来可以帮助我的研究…… - Jay
我使用了videoView.setVideoPath(path);来设置公共URL。 - Carlo Espino

6

我尝试了这个。但是出现了错误:AudioTrack 获取缓冲超时 Audio Flinger 写入被阻塞了70秒 - zeeshan

6
我认为这可能会帮助您找到一些解决方案。
mp=new MediaPlayer();                    
mp.setDataSource(path);
mp.setScreenOnWhilePlaying(true);
mp.setDisplay(holder);
mp.prepare();
mp.start();

3

如果您在模拟器上尝试此操作,可能需要在真实设备上尝试,因为有时我也会遇到相同的问题。我无法在模拟器中查看视频,但是在移动设备上可以正常播放视频。问题可能是与模拟器有关,而不是与您的代码有关。


1

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

需要使用 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>

enter image description here


0
你应该在 onResume 中完成它,因为在 onCreate 中,VideoView 不知道其大小,无法创建正确的表面来显示视频。
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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接