在Android的VideoView中播放视频

问题描述 投票:57回答:13

我不知道为什么我无法在VideoView中播放视频。我收到的消息是:

无法播放视频:很抱歉,无法播放此视频。

我也为模拟器创建了SD卡。我需要将SD卡放在SDK的特定文件夹中吗?请给出意见。

这里是布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
   android:id="@+id/LinearLayout01"
   android:layout_height="fill_parent"     
   android:paddingLeft="2px"
   android:paddingRight="2px"
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:paddingTop="2px"
   android:paddingBottom="2px"
   android:layout_width="fill_parent"
   android:orientation="vertical">

      <VideoView 
         android:layout_height="fill_parent"
         android:layout_width="fill_parent" 
         android:id="@+id/VideoView" />

</LinearLayout>

这里是代码:

package com.examples.videoviewdemo;

import android.app.Activity;
import android.os.Bundle;
import android.widget.MediaController;
import android.widget.VideoView;

public class VideoViewDemo extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        VideoView videoView = (VideoView)findViewById(R.id.VideoView);
        //MediaController mediaController = new MediaController(this);
        // mediaController.setAnchorView(videoView);
        //videoView.setMediaController(mediaController);

        videoView.setVideoPath("/sdcard/blonde_secretary.3gp");

        videoView.start();  
    }
}

等待回复...

android
13个回答
33
投票

我的猜测是您的视频与Android不兼容。尝试其他视频。 This one肯定works曾经用于Android(但由于某些原因,不能在较新的设备上使用)。如果该视频正常播放,而您的视频不正常,则您的视频与Android不兼容。

正如其他人指出的,请在设备上进行测试。在模拟器上播放视频需要太多功率。

UPDATE 2020-02-18https://law.duke.edu/cspd/contest/videos/Framed-Contest_Documentaries-and-You.mp4是具有相同内容的MP4,但是我不知道它是否与我以前链接的MP4相同。


0
投票

嗯!如果您使用的是Android兼容视频,则此警报的唯一原因是您必须使用大于300MB的视频。Android不支持大型视频(> 300MB)。我们可以使用NDK优化来获得它。


0
投票

我对VideoView几乎有同样的问题。我尝试使用Nexus 5播放视频(1080 * 1080),并且效果很好,但Galaxy ace 2上的同一视频却显示“无法播放视频”消息。

但是我注意到视频的清晰度较低(120x120),效果很好。

所以也许只是“大小”问题(尤其是关于Blonde_secretary.3gp视频....]


0
投票
//just copy this code to your main activity.

 if ( ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ){
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE)){

            }else {
                ActivityCompat.requestPermissions(MainActivity.this,new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},1);
            }
        }else {
        }

0
投票

问题可能与电影格式有关。如果它是H264编码的,请确保它在基线配置文件中。


21
投票

示例项目

我终于有了一个概念验证项目,可以在这里分享。

设置布局

布局是这样设置的,浅灰色区域是VideoView

enter image description here

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.videotest.MainActivity">

    <VideoView
        android:id="@+id/videoview"
        android:layout_width="300dp"
        android:layout_height="200dp"/>

    <Button
        android:text="Play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/videoview"
        android:onClick="onButtonClick"
        android:id="@+id/button"/>

</RelativeLayout>

准备视频剪辑

根据documentation,Android应该支持所有API级别的mp4 H.264播放(解码)。但是,似乎有很多因素会影响实际视频是否播放。我能找到的最深入的答案是here,它告诉您如何编码视频。它使用功能强大的ffmpeg命令行工具将其转换为可以在所有(希望吗?)Android设备上播放的东西。阅读我链接到的答案以获取更多说明。我使用了稍微修改的版本,因为我在使用原始版本时遇到了错误。

ffmpeg -y -i input_file.avi -s 432x320 -b:v 384k -vcodec libx264 -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8 -subq 6 -trellis 0 -refs 5 -bf 0 -coder 0 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -c:a aac -ac 1 -ar 16000 -r 13 -ab 32000 -aspect 3:2 -strict -2 output_file.mp4

我肯定会仔细阅读每个参数的内容,以了解哪些参数需要就视频和音频质量进行调整。

[下一步,将output_file.mp4重命名为test.mp4,并将其放置在Android项目的/res/raw文件夹中。如果该文件夹尚不存在,请创建它。

代码

代码没有太多内容。单击“播放”按钮即可播放视频。感谢this answer的帮助。

MainActivity.java

public class MainActivity extends AppCompatActivity {

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

    public void onButtonClick(View v) {
        VideoView videoview = (VideoView) findViewById(R.id.videoview);
        Uri uri = Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.test);
        videoview.setVideoURI(uri);
        videoview.start();
    }
}

完成

就这些。您现在应该可以在模拟器或真实设备上播放视频剪辑。


7
投票

使videoView为活动类的成员变量,而不是将其保留为onCreate函数的局部变量:

VideoView videoView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    videoView = (VideoView)findViewById(R.id.VideoView);        
    videoView.setVideoPath("/sdcard/blonde_secretary.3gp");
    videoView.start();  
}

5
投票

在清单中添加android.permission.READ_EXTERNAL_STORAGE,对我有用


2
投票

代码似乎完美无缺!简单明了。因此,它应该可以在电话上使用。模拟器很难播放视频,这也发生在我身上。

尝试将所需的API级别提高到最新水平,可能会有所帮助!

右键单击打开的项目,选择属性> Android>在右侧检查最新版本...

伊戈尔


2
投票

您可以通过DDMS访问SD卡


2
投票

[要确认您的视频格式正确(分辨率,比特率,编解码器等),请使用official documentation-以下摘录:

标准清晰度(低质量)视频编解码器-H.264视频分辨率-176 x 144像素视频帧频-12 fps视频比特率-56 Kbps音频编解码器-AAC-LC音频通道-(单声道)音频比特率-24 Kbps

标准清晰度(高质量)视频编解码器-H.264视频分辨率-480 x 360像素视频帧频-30 fps视频比特率-500 Kbps音频编解码器-AAC-LC音频通道-2(立体声)音频比特率-128 Kbps

高清720p(在所有设备上均不适用)视频编解码器-H.264影片解析度-1280 x 720像素视频帧频-30 fps视频比特率-2 Mbps音频编解码器-AAC-LC音频通道-2(立体声)音频比特率-192 Kbps


2
投票
VideoView videoView =(VideoView) findViewById(R.id.videoViewId);

Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+"/yourvideo");

 videoView.setVideoURI(uri);
videoView.start();

不是使用setVideoPath而是使用setVideoUri。您可以使用(Environment.getExternalStorageDirectory()。getAbsolutePath()+“ / yourvideo”)获取存储在外部存储中的视频的路径,并将其解析为Uri。如果您的视频存储在sdcard / MyVideo / video.mp4中,则将代码中的“ / yourvideo”替换为“ /MyVideo/video.mp4”

对我来说这很好:)`


2
投票

VideoView只能流式传输3gp视频,我建议使用此代码来流式传输视频或尝试使用更高版本的android。尝试在线视频流。

public void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.main);
    String videourl = "http://something.com/blah.mp4";
    Uri uri = Uri.parse(videourl);
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    intent.setDataAndType(uri, "video/mp4");
    startActivity(intent);
}

Click here to watch Android Video Streaming Tutorial

© www.soinside.com 2019 - 2024. All rights reserved.