简体   繁体   English

Android无法使用VideoView播放mp4视频?

[英]Android Could not play mp4 video with VideoView?

I am trying to stream mp4 video with fullscreen activity only contain of videoview. 我正在尝试以全屏活动流式播放mp4视频,仅包含videoview。 But even though it easily play on my galaxt s3, it does not play most of the devices. 但是,即使它可以在我的galaxt s3上轻松播放,也不能在大多数设备上播放。 I suspect its about encoding of the video (by the way you have to be codec guru to know which video play which not). 我怀疑它与视频编码有关(顺便说一句,您必须是编解码大师才能知道哪个视频播放哪个视频)。

Here is the code I am using. 这是我正在使用的代码。

    //make screen full with video
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFormat(PixelFormat.TRANSLUCENT);
    setContentView(R.layout.full_screen_video);

    //get extra video source string
    Intent intent = getIntent();
    if(intent != null){
        videoSrc = intent.getStringExtra(TefalTvApp.RECIPE_VIDEO_SOURCE);
        if (DEBUG) {
            Log.d(TAG, "Recipe title : " + videoSrc);   
        }
    }

    video = (VideoView) findViewById(R.id.recipeVideo);
    controller = new MediaController(FullScreenVideoActivity.this);
    controller.setMediaPlayer(video);
    video.setMediaController(controller);
    video.setVideoPath(videoSrc);
    video.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            if (DEBUG) {
                Log.d(TAG, "Hello wworld");
            }
        }
    });

    video.setOnPreparedListener(new OnPreparedListener() {

        @Override
        public void onPrepared(MediaPlayer mp) {
            video.requestFocus();
            video.start();  
        }
    });

Here is the debug result. 这是调试结果。 You have the video url in the debug. 您在调试中具有视频URL。

08-23 23:25:53.349: D/RecipeDetailActivity(18179): Video src : http://www.tefaltv.com/Upload/Video/acticook_kiymalifasulye.mp4
08-23 23:25:53.379: I/ApplicationPackageManager(18179): cscCountry is not German : TUR
08-23 23:25:53.389: D/FullScreenVideoActivity(18179): Recipe title : http://www.tefaltv.com/Upload/Video/acticook_kiymalifasulye.mp4
08-23 23:25:53.399: D/VideoView(18179): onMeasure()
08-23 23:25:53.399: I/VideoView(18179):     Setting size: 480x295
08-23 23:25:53.439: I/MediaPlayer(18179): uri is:http://www.tefaltv.com/Upload/Video/acticook_kiymalifasulye.mp4
08-23 23:25:53.439: I/MediaPlayer(18179): path is null
08-23 23:25:53.439: D/MediaPlayer(18179): Couldn't open file on client side, trying server side
08-23 23:25:53.519: D/VideoView(18179): onMeasure()
08-23 23:25:53.519: I/VideoView(18179):     Setting size: 480x295
08-23 23:25:57.689: I/VideoView(18179): start()
08-23 23:25:57.739: D/VideoView(18179): onMeasure()
08-23 23:25:57.739: I/VideoView(18179):     Setting size: 480x270
08-23 23:25:57.759: E/MediaPlayer(18179): error (1, -2147483648)
08-23 23:25:57.769: I/VideoView(18179): start()
08-23 23:25:57.779: E/MediaPlayer(18179): start called in state 0
08-23 23:25:57.779: E/MediaPlayer(18179): error (-38, 0)
08-23 23:25:57.799: E/MediaPlayer(18179): Error (1,-2147483648)
08-23 23:25:57.799: D/VideoView(18179): Error: 1,-2147483648
08-23 23:25:57.799: E/MediaPlayer(18179): Error (-38,0)
08-23 23:25:57.799: D/VideoView(18179): Error: -38,0

UPDATE : Video encoding details : Format : H.264, 624 x 351 AAC, 44100 Hz, Stereo (LR) FPS : 25 Data Rate: 2.23mbit/s Current size : 624x351 px actual 更新:视频编码详细信息:格式:H.264,624 x 351 AAC,44100 Hz,立体声(LR)FPS:25数据速率:2.23mbit / s当前大小:624x351 px实际

This is mostly because of the encoding . 这主要是因为编码。 I see that your video file resolution is 624x351 which is not standard, so that might be one reason . 我看到您的视频文件分辨率为624x351,这不是标准的,所以这可能是原因之一。 Also check the maximum bit rate and fps as all the mobile devices have some cap over it , like for most of android mobile phones its 30fps. 还要检查最大比特率和fps,因为所有移动设备都对其设置了上限,例如,对于大多数Android手机,其最大为30fps。 You should refer this document to make your file compatible with all the android phones. 您应该参考此文档,以使您的文件与所有android手机兼容。 Android Media Formats Android媒体格式

Also, if you can share the encoding command (if you are executing one), it will be easy to trace the issue. 另外,如果您可以共享编码命令(如果您正在执行一个编码命令),则很容易找到问题所在。

I suggest you for the following Code wherein i am running my application successfully 我建议您使用以下代码,其中我正在成功运行我的应用程序

The Code is as Follows: 该代码如下:

XML file: XML档案:

     <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#f0f0f0" >

        <Button
            android:id="@+id/btnVideoGallery"
            android:layout_width="75dp"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="15dp"
            android:text="@string/gallery" />

        <Button
            android:id="@+id/btnCancel"
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:layout_below="@+id/btnVideoGallery"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="22dp"
            android:text="@string/cancel" />

        <TextView
            android:id="@+id/lblDisplayImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/btnCancel"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="10dp"
            android:text="@string/below_this_text_video_will_be_displayed"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#000000"
            android:textSize="13dp" />

        <VideoView
            android:id="@+id/vvDisplayVideo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/lblDisplayImage"
            android:layout_marginTop="15dp" />

    </RelativeLayout>

Java File: Java文件:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.MediaController;
import android.widget.VideoView;

public class VideoActivity extends Activity {

    private Button btnVideoGallery,btnCancel;
    private VideoView vvDisplayVideo;
    /** The Constant PICK_VIDEO. */
    private static final int PICK_VIDEO=1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video_options);

        btnVideoGallery=(Button)findViewById(R.id.btnVideoGallery);
        vvDisplayVideo=(VideoView)findViewById(R.id.vvDisplayVideo);
        btnCancel=(Button)findViewById(R.id.btnCancel);
        vvDisplayVideo.setVisibility(View.GONE);

        btnVideoGallery.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                Intent video=new Intent();
                video.setAction(Intent.ACTION_PICK);
                video.setType("video/*");
                startActivityForResult(video, PICK_VIDEO);

            }
        });

        btnCancel.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                Intent goStartUp=new Intent(VideoActivity.this, StartUpActivity.class);
                goStartUp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(goStartUp);
                finish();
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        if (resultCode==Activity.RESULT_OK && requestCode == PICK_VIDEO) {

            vvDisplayVideo.setVisibility(View.VISIBLE);
            vvDisplayVideo.setVideoURI(data.getData());
            vvDisplayVideo.setFocusable(true);
            MediaController mc=new MediaController(this);
            vvDisplayVideo.setMediaController(mc);
            Log.i("True", "Executed");
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub

        Intent goStartUp=new Intent(VideoActivity.this, StartUpActivity.class);
        goStartUp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(goStartUp);
        finish();
        return super.onKeyDown(keyCode, event);
    }
}

Also you can modify the Manifest File as per your use: 您还可以根据自己的使用修改清单文件:

<manifest ...
<uses-sdk...  />
<uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_VIDEO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />

<application .....
</application>

</manifest>

您正在流式传输的视频大小与视频观看大小不同

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM