在Android中使用VideoView播放视频

65
我无法理解为什么我的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();  
    }
}

等待回复中...


您是在设备上还是在模拟器上尝试进行此操作?我认为模拟器不支持视频播放。从文件管理器(例如ASTRO)加载时,视频在设备上播放正常吗? - Dave
我正在尝试在模拟器上播放视频文件。我有一个简单的文件管理器,可以从我的DDMS访问。ASTRO是什么意思? - Muhammad Maqsoodur Rehman
1
我的所有视频文件都放在res/raw文件夹中。 - Muhammad Maqsoodur Rehman
从资源:https://dev59.com/aHA75IYBdhLWcg3w7tx6 - Ciro Santilli OurBigBook.com
24
金发秘书,ROFL (注:ROFL是网络语言,意为“滚动笑”) - user8196092
显示剩余3条评论
13个回答

36

我猜你的视频不兼容Android系统。尝试使用其他视频。这个使用过去可以在Android上播放(但在较新的设备上不能播放)。如果这个视频可以播放而你的不行,则你的视频不兼容Android。

正如其他人所说,请在设备上测试此功能。模拟器上的视频播放需要太多的功率。

更新日期:2020年02月18日https://law.duke.edu/cspd/contest/videos/Framed-Contest_Documentaries-and-You.mp4是相同内容的MP4文件,但我不知道它是否与我之前链接的实际MP4文件相同。


1
@Maxood:那你的设备可能出了些问题。这个视频我已经在所有我试过的设备上播放过了:G1,DROID,N1,Incredible等等。实际上,就在最近几小时内,我还在Incredible上播放了这个视频。请记住,在Android 2.2和某些其他设备上,你永远不应该硬编码“/sdcard”,因为它是错误的。 - CommonsWare
1
@Maxood: "现在在Android上运行视频文件需要什么先决条件?" -- 你的DROID手机?我不知道。再次说明,该视频在安装有Android 2.0和2.1的DROID手机上播放正常。我还没有为DROID手机获得2.2更新,因此尚未测试该组合下的视频。"另外,我应该编写什么代码来代替/sdcard?" -- Environment.getExternalStorageDirectory() - CommonsWare
2
@Maxood:我也建议你切换到这个代码,以确保问题不是由于你的实现所引起的: http://github.com/commonsguy/cw-advandroid/tree/master/Media/Video/ - 这样我们就可以确定问题只限于你的DROID设置。另外,这个新的DROID运行的Android版本是什么? - CommonsWare
4
请先尝试在 Android 上使用默认媒体播放器播放视频(模拟器或真实设备都可以)。看看是否至少支持一个受支持的编解码器。如果是这种情况,请进入您的应用程序/VideoView 进一步调试。这样可以节省时间,以防问题不是出现在您的应用程序上,而是出现在视频本身上。虽然“纪录片和你”视频肯定可以正常工作,但您的主机 PC 可能缺少一些运行模拟器所需的代码。 - Mathias Conradt
1
@BenLeggiero:他们似乎重新组织了网站。所有这些比赛获胜者都在https://web.law.duke.edu/cspd/contest/finalists/ -- 我最初链接的是“纪录片和你”。MP4的直接链接是https://law.duke.edu/cspd/contest/videos/Framed-Contest_Documentaries-and-You.mp4。我会更新答案。感谢您指出这一点! - CommonsWare
显示剩余8条评论

29

示例项目

我终于成功地实现了一个概念验证项目,所以我会在这里分享它。

设置布局

布局设置如下,其中浅灰色区域是VideoView

输入图像描述

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>

准备视频剪辑

根据文档,Android应该支持所有API级别的mp4 H.264播放(解码)。然而,似乎有许多因素会影响实际视频是否能够播放。我找到的最详细的答案是这里,它使用强大的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文件夹中。如果还不存在该文件夹,请创建它。

代码

代码不多。当单击“播放”按钮时,视频开始播放。感谢这个答案提供的帮助。

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

完成

就这些了。现在你应该能够在模拟器或真实设备上播放你的视频剪辑了。


你好,很高兴你找到了解决方案。我遇到了困难。我有一个类似的问题,但我的视频存储在Firebase Storage中。你能否看一下这个帖子,帮我找到线索呢?请指导我。 - coderpc
3
@PC。我从未使用过Firebase,但你应该将问题分解为较小的部分。首先确保Android可以播放本地存储的视频(如上面的示例)。如果这样可以工作,那么尝试从Firebase下载(而不是流式传输)它,并查看是否可以以与本地相同的方式播放。 - Suragch

8
videoViewonCreate函数的本地变量改为activity类的成员变量:
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();  
}

4
这与问题无关,不会改变任何事情。 - zeh
2
很好的例子,我喜欢你的视频路径。 - Berat Eyüboğlu

5

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

或者点击这里观看Android视频流教程


如何显示当前记录的视频? - user4574256

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

对我来说,清单文件中缺少的互联网权限是问题所在:<uses-permission android:name="android.permission.INTERNET" />。 - Javad
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> - nafsaka

3
VideoView videoView =(VideoView) findViewById(R.id.videoViewId);

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

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

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

这对我来说很有效 :)


1
请为您的代码示例添加描述并格式化代码。 - Maciej Lach
@MaciejLach 我已经加上了描述。这是我在stackoverflow上的第一个答案。谢谢你帮助我提高我的回答。 - Vikash Kumar Verma

2

要确认您的视频格式(分辨率,比特率,编解码器等)是否正确,请参考官方文档 - 下面是提取内容:

标准清晰度(低质量)
视频编解码器 - 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

这段代码似乎完美无缺!简单明了。


所以它应该可以在手机上运行。模拟器播放视频时会遇到困难,我也有过这种情况。

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

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

Igor


我需要在这里使用1.6版本。不知道你能否告诉我如何将我的设备操作系统更新到2.2(Froyo)?谢谢。 - Muhammad Maqsoodur Rehman
我在我的DROID上安装了2.0.1版,并尝试在上面运行此代码,但仍然无法成功。请告诉我问题出在哪里? - Muhammad Maqsoodur Rehman

2

您可以通过DDMS访问您的SD卡


如果一个安卓设备(HTC,DROID等)没有安装SD卡,那么我们能否在该设备上的应用程序中播放视频? - Muhammad Maqsoodur Rehman
我在Logcat窗口中收到以下错误信息:07-21 03:35:47.854: ERROR/PlayerDriver(30): Command PLAYER_SET_DATA_SOURCE 完成时出现错误或信息PVMFErrNotSupported 07-21 03:35:47.864: ERROR/MediaPlayer(284): 错误(1,-4) 07-21 03:35:47.872: ERROR/MediaPlayer(284):错误(1,-4) - Muhammad Maqsoodur Rehman

0

问题可能出在电影格式上。如果它是H264编码,请确保它是基本配置文件。


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