reproductor - videos para android studio
Reproducción de un video en VideoView en Android (13)
Proyecto de ejemplo
Finalmente conseguí un proyecto de prueba de concepto para trabajar, así que lo compartiré aquí.
Configurar el diseño
El diseño está configurado de esta manera, donde el área gris claro es 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>
Preparar video clip
De acuerdo con la documentation , Android debería admitir la reproducción mp4 H.264 (decodificación) para todos los niveles API. Sin embargo, parece haber muchos factores que afectan si un video real se reproducirá o no. La respuesta más profunda que pude encontrar fue la que dice cómo codificar los videos. Utiliza la poderosa herramienta de línea de comandos ffmpeg
para hacer la conversión a algo que debería poder reproducirse en todos (¿y con suerte?) Dispositivos Android. Lea la respuesta a la que me he vinculado para obtener más explicaciones. Usé una versión ligeramente modificada porque recibía errores con la versión original.
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
Definitivamente leería mucho más sobre cada uno de esos parámetros para ver qué necesidad hay de ajustar en cuanto a calidad de audio y video.
A continuación, cambie el nombre de test.mp4
a test.mp4
y póngalo en la carpeta /res/raw
su proyecto Android. Crea la carpeta si no existe ya.
Código
No hay mucho para el código. El video se reproduce cuando se hace clic en el botón "Reproducir". Gracias a esta respuesta por ayuda.
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();
}
}
Terminado
Eso es todo. Debería poder reproducir su video clip en el simulador o en un dispositivo real ahora.
No puedo entender por qué no puedo reproducir el video en mi VideoView. Todo lo que recibo por un mensaje es:
No se puede reproducir el video: Lo sentimos, este video no se puede reproducir.
Creé una tarjeta SD para mi emulador también. ¿Debo colocar mi tarjeta SD en una carpeta particular en mi SDK? Por favor comenta.
Aquí está el diseño:
<?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>
Aquí está el código:
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();
}
}
Esperando la respuesta ...
¡El código parece ser perfecto! Simple y simple.
Por lo tanto, debería funcionar en el teléfono. El emulador está teniendo dificultades para reproducir videos, me pasó a mí también.
Intente aumentar el nivel de API requerido a la última, ¡podría ser útil!
Haga clic con el botón derecho en el proyecto abierto, elija Propiedades> Android> revise la última versión en el lado derecho ...
Igor
Agregue android.permission.READ_EXTERNAL_STORAGE en manifiesto, funcionó para mí
Bien ! Si está utilizando un video de compatibilidad de Android, la única causa de esta alerta es que debe usar un video de un tamaño superior a los 300 MB. Android no admite video de gran tamaño (> 300 MB). Podemos obtenerlo mediante el uso de la optimización NDK.
El problema podría ser con el formato de Película. Si está codificado en H264, asegúrese de que esté en el perfil de línea base.
Haga que videoView
una variable miembro de su clase de actividad en lugar de mantenerlo como local para la función 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();
}
Para confirmar que su video está en el formato correcto (resolución, tasa de bits, códec, etc.) consulte con la documentación oficial - extraiga a continuación:
Definición estándar (baja calidad)
Códec de video - H.264
Resolución de video: 176 x 144 px
Velocidad de fotogramas de video: 12 fps
Velocidad de bits de video: 56 Kbps
Códec de audio - AAC-LC
Canales de audio - (mono)
Velocidad de bits de audio: 24 Kbps
Definición estándar (alta calidad)
Códec de video - H.264
Resolución de video: 480 x 360 px
Velocidad de fotogramas de video: 30 fps
Velocidad de bits de video: 500 Kbps
Códec de audio - AAC-LC
Canales de audio - 2 (estéreo)
Velocidad de bits de audio: 128 Kbps
Alta definición 720p (N / A en todos los dispositivos)
Códec de video - H.264
Resolución de video: 1280 x 720 px
Velocidad de fotogramas de video: 30 fps
Velocidad de bits de video: 2 Mbps
Códec de audio - AAC-LC
Canales de audio - 2 (estéreo)
Velocidad de bits de audio: 192 Kbps
Puede acceder a su tarjeta SD a través del DDMS
Supongo que tu video no es compatible con Android. Pruébalo con un video diferente. Esta definitivamente funciona para trabajar con Android (pero no en dispositivos más nuevos, por alguna razón). Si ese video funciona, y el tuyo no, entonces tu video no es compatible con Android.
Como otros han indicado, prueba esto en un dispositivo. La reproducción de video en el emulador requiere demasiada potencia.
Tengo casi el mismo problema con VideoView. Intento reproducir un video (1080 * 1080) con un Nexus 5 y funciona bien, pero el mismo video en Galaxy ace 2 me da el mensaje de video No se puede reproducir.
Pero noté que con una definición más baja del video (120x120), funciona bien.
Entonces quizás solo sea cuestión de "Tamaño" (y especialmente con el video blonde_secretary.3gp ...)
VideoView solo puede transmitir videos de 3gp. Recomiendo este código para transmitir su video o probar una versión superior de Android. Pruebe Video Online Streaming.
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);
}
O haga clic aquí para ver el tutorial de transmisión de video de Android .
//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 {
}
VideoView videoView =(VideoView) findViewById(R.id.videoViewId);
Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+"/yourvideo");
videoView.setVideoURI(uri);
videoView.start();
En lugar de usar setVideoPath usa setVideoUri. puede obtener la ruta de su video almacenada en almacenamiento externo al usar (Environment.getExternalStorageDirectory (). getAbsolutePath () + "/ yourvideo") y analizarlo en Uri. Si su video está almacenado en sdcard / MyVideo / video.mp4, reemplace "/ yourvideo" en el código por "/MyVideo/video.mp4"
Esto funciona bien para mí :) `