在Android中使用VideoView播放video

我无法弄清楚为什么我无法在VideoView中播放video。 我得到的消息是:

无法播放video:对不起,此video无法播放。

我也为我的模拟器创build了一个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(); } } 

等待答复…

我的猜测是你的video与Android不兼容。 尝试使用不同的video。 这一个绝对有用的工作与Android(但不在较新的设备,出于某种原因)。 如果该video有效,而您的video不兼容,那么您的video与Android不兼容。

正如其他人所指出的,请在设备上进行testing。 模拟器上的video播放需要太多的电力。

示例项目

我终于得到了一个概念validation项目,所以我将在这里分享。

设置布局

布局是这样设置的,浅灰色区域是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> 

准备video剪辑

根据文档 ,Android应该支持所有API级别的mp4 H.264回放(解码)。 但是,影响实际video播放与否的因素似乎有很多。 我可以find最深入的答案,告诉如何编码video在这里 。 它使用function强大的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 

我肯定会读到更多关于这些参数的每一个,看看哪些需要调整video和audio质量。

接下来,将output_file.mp4重命名为test.mp4并将其放在您的Android项目的/res/raw文件夹中。 创build文件夹,如果它不存在已经。

代码没有太多的东西。 video在点击“播放”button时播放。 感谢这个答案的帮助。

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

成品

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

使videoView成为您的活动类的成员variables,而不是将其保留为onCreate函数的本地variables:

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

在清单中添加android.permission.READ_EXTERNAL_STORAGE,为我工作

代码似乎是完美的! 简单明了。
所以它应该在电话上工作。 模拟器播放video很难,它也发生在我身上。

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

右键点击打开的项目,select属性>安卓>检查右侧的最新版本…

伊戈尔

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

要确认您的video格式是否正确(分辨率,比特率,编解码器等),请查看官方文档 – 摘录如下:

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

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

高清720p(在所有设备上不适用)
video编解码器 – H.264
video分辨率 – 1280 x 720像素
video帧速率 – 30 fps
video比特率 – 2 Mbps
audio编解码器 – AAC-LC
audio频道 – 2(立体声)
audio比特率 – 192 Kbps

 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”)获取存储在外部存储器中的videopath,并将其parsing为Uri。 如果您的video存储在sdcard / MyVideo / video.mp4中,请用“/MyVideo/video.mp4”replace“/ yourvideo”

这工作正常:)

VideoView只能stream3gp的video我推荐这个代码来stream你的video或尝试更高版本的机器人。 尝试video在线stream媒体。

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

或点击这里观看Androidvideostream教程 。

好 ! 如果您使用的是Android兼容性video,那么此警报的唯一原因是您必须使用大小超过300MB的video。 Android不支持大video(> 300MB)。 我们可以通过使用NDK优化来获得它。

这个问题可能与电影格式有关。 如果它的H264编码,请确保它在基准轮廓。

我有与VideoView几乎相同的问题。 我尝试使用Nexus 5播放video(1080 * 1080),效果不错,但Galaxy ace 2上的相同video给了我无法播放video消息。

但我注意到,与video(120×120)较低的定义,它工作正常。

所以也许只是一个“大小” (特别是与blonde_secretary.3gpvideo….)

 //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 { }