Воспроизведение видео в VideoView в Android - PullRequest
55 голосов
/ 16 июля 2010

Я не могу понять, почему я не могу воспроизвести видео в моем 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();  
    }
}

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

Ответы [ 13 ]

32 голосов
/ 19 августа 2010

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

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

20 голосов
/ 09 декабря 2016

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

У меня наконец-то появился проект для проверки концепции, поэтому я поделюсь им здесь.

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

Макет настроен следующим образом: светло-серая область - VideoView.

enter image description here

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 должен поддерживать воспроизведение (декодирование) mp4 H.264 для всех уровней API. Однако существует множество факторов, которые влияют на то, будет ли воспроизводиться реальное видео или нет. Самый глубокий ответ, который я мог найти, который сказал, как кодировать видео, это здесь . Он использует мощный инструмент командной строки 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 и поместите его в папку /res/raw вашего проекта Android. Создайте папку, если она еще не существует.

Код

В коде немногое. Видео воспроизводится при нажатии кнопки «Воспроизвести». Спасибо этому ответу за помощь.

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

Закончено

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

7 голосов
/ 22 июня 2012

Сделать 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();  
}
5 голосов
/ 17 февраля 2015

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

2 голосов
/ 12 февраля 2016
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"

Это прекрасно работает для меня :) `

2 голосов
/ 29 апреля 2014

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

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

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

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

2 голосов
/ 05 июня 2013

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 .

2 голосов
/ 19 июля 2010

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

2 голосов
/ 19 июля 2010

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

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

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

Игорь

0 голосов
/ 21 апреля 2017
//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 {
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...