Воспроизведение видео в VideoView на 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>

Здесь код:

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

Ожидание ответа...

Ответ 1

Я предполагаю, что ваше видео несовместимо с Android. Попробуйте это с другим видео. Этот один определенно работает, используемый для работы с Android (но по каким-то причинам не работает на более новых устройствах). Если это видео работает, а ваше нет, то ваше видео не совместимо с Android.

Как показали другие, пожалуйста, проверьте это на устройстве. Воспроизведение видео на эмуляторе требует слишком большой мощности.

Ответ 2

Пример проекта

Наконец-то я получил проект доказательной концепции для работы, поэтому я расскажу об этом здесь.

Настройка макета

Макет настроен таким образом, где светло-серая область - 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>

Подготовить видеоклип

Согласно документации здесь. Он использует мощный инструмент командной строки 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();
    }
}

Пройденные

Это все. Теперь вы сможете воспроизводить свой видеоклип на симуляторе или реальном устройстве.

Ответ 3

Сделайте 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();  
}

Ответ 4

Добавить android.permission.READ_EXTERNAL_STORAGE в манифест, работал у меня

Ответ 5

Код кажется безупречным! Простой и понятный.

Поэтому он должен работать по телефону. Эмулятор испытывает трудности с воспроизведением видео, это случилось со мной тоже.

Попробуйте повысить уровень API до последнего, это может помочь!

Щелкните правой кнопкой мыши по открытому проекту, выберите "Свойства" > "Android" > проверить последнюю версию с правой стороны...

Игорь

Ответ 6

Вы можете получить доступ к своей SD-карте с помощью DDMS

Ответ 7

VideoView может воспроизводить только видеоролики Stream 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.

Ответ 8

Чтобы подтвердить, что видео находится в правильном формате (разрешение, биттрейт, кодек и т.д.), установите флажок официальная документация - выдержка ниже:

Стандартное определение (низкое качество)
Видеокодек - H.264
Разрешение видео - 176 x 144 px
Частота кадров видео - 12 fps
Битрейт видео - 56 Кбит/с
Аудиокодек - AAC-LC
Аудиоканалы - (моно)
Битрейт аудио - 24 Кбит/с

Стандартное определение (высокое качество)
Видеокодек - H.264
Разрешение видео - 480 x 360 px
Частота кадров видео - 30 fps
Битрейт видео - 500 Кбит/с
Аудиокодек - AAC-LC
Аудиоканалы - 2 (стерео)
Битрейт аудио - 128 Кбит/с

Высокое разрешение 720p (N/A на всех устройствах)
Видеокодек - H.264
Разрешение видео - 1280 x 720 px
Частота кадров видео - 30 fps
Битрейт видео - 2 Мбит/с
Аудиокодек - AAC-LC
Аудиоканалы - 2 (стерео)
Битрейт аудио - 192 Кбит/с

Ответ 9

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"

Это отлично работает для меня:) `

Ответ 10

Хорошо! если вы используете видео совместимость для Android, единственная причина этого предупреждения - вы должны использовать видео размером более 300 МБ. Android не поддерживает большое видео ( > 300 МБ). Мы можем получить его с помощью оптимизации NDK.

Ответ 11

Проблема может быть с форматом фильма. Если это кодируется H264, убедитесь, что это в базовом профиле.

Ответ 12

У меня почти такая же проблема с VideoView. Я пытаюсь воспроизвести видео (1080 * 1080) с Nexus 5, и он работает хорошо, но одно и то же видео на Galaxy ace 2 дает мне сообщение Can not Play Video.

Но я замечаю, что при более низком определении видео (120x120) он отлично работает.

Так что, возможно, дело только в "Размер", (и особенно с blonde_secretary.3gp видео....)

Ответ 13

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