在Android中的VideoView中播放视频

Muh*_*man 56 android

我无法弄清楚为什么我无法在我的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>
Run Code Online (Sandbox Code Playgroud)

这是代码:

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();  
    }
}
Run Code Online (Sandbox Code Playgroud)

等待回复......

Com*_*are 33

我的猜测是你的视频与Android不兼容.尝试使用其他视频.这个肯定适用于Android(但由于某种原因不适用于较新的设备).如果该视频有效,而您的视频无效,那么您的视频与Android不兼容.

正如其他人所说,请在设备上进行测试.模拟器上的视频播放需要太多电量.

  • 尝试使用Android上的常规默认媒体播放器播放视频(模拟器或真实设备,无论您在哪里测试).然后你看看你是否至少有一个受支持的编解码器.如果是这种情况,请进入您的app/VideoView进一步调试.这可以节省一些时间,以防问题与您的应用无关,而是与视频本身有关.纪录片和你的视频应该肯定有用.或者你在运行模拟器的主机上缺少一些代码. (4认同)
  • @Maxood:我还建议你切换到这个代码,以确保它不是你的实现:http://github.com/commonsguy/cw-advandroid/tree/master/Media/Video/ - 这样,我们可以确定问题仅限于您的DROID设置.此外,这个新的DROID运行的是什么版本的Android? (2认同)

Sur*_*gch 21

示例项目

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

设置布局

布局设置如下,浅灰色区域是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>
Run Code Online (Sandbox Code Playgroud)

准备视频剪辑

根据文档,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
Run Code Online (Sandbox Code Playgroud)

我肯定会在每个参数上阅读更多内容,看看哪个需要调整视频和音频质量.

接下来,重命名output_file.mp4test.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

成品

就这样.您现在应该可以在模拟器或真实设备上播放视频片段.

  • @PC.我从未使用过Firebase,但您应该将问题分解成更小的部分.首先确保Android将播放视频(如果它存储在本地)(如上例所示).如果可以,那么请尝试从Firebase下载(而非流式传输),看看是否可以像在本地一样播放它. (2认同)

小智 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();  
}
Run Code Online (Sandbox Code Playgroud)

  • 这与问题无关,不会改变任何事情. (3认同)
  • 很好的例子,我喜欢你的视频路径 (2认同)

Jay*_*ang 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);
}
Run Code Online (Sandbox Code Playgroud)

点击这里观看安卓视频流教程


小智 5

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