Reproducción de un video en VideoView en Android

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:

    

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 …

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.

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 .

enter image description here

activity_main.xml

      

Preparar video clip

De acuerdo con la documentación , Android debería admitir la reproducción mp4 H.264 (deencoding) 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.

Agregue android.permission.READ_EXTERNAL_STORAGE en manifiesto, funcionó para mí

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

¡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 boost 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

Puede acceder a su tarjeta SD a través del DDMS

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 fotogtwigs 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 fotogtwigs 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 fotogtwigs 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

 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í 🙂 `

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 .

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.

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 (120×120), funciona bien.

Entonces quizás solo sea cuestión de “Tamaño” (y especialmente con el video blonde_secretary.3gp …)

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

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.