2012-01-30 9 views
12

Estoy usando la siguiente biblioteca para transmitir videos de YouTube a una aplicación de Android.Transmitir a VideoView solo se reproduce en Wifi cuando usa teléfonos Samsung

http://code.google.com/p/android-youtube-player/source/browse/trunk/OpenYouTubeActivity/src/com/keyes/youtube/OpenYouTubePlayerActivity.java?r=3

estoy con éxito capaz de reproducir videos en HTC y Motorola teléfonos a través de 3G y Wifi. Sin embargo, en los teléfonos Samsung Galaxy (Epic 4G) y Samsung Galaxy II solo puedo jugar usando Wifi. 3G me da este error: "No se puede reproducir el video. Lo siento, este video no se puede reproducir".

He intentado forzar la transmisión de YouTube de baja calidad, pero esto no ayudó. Veo en mi registro que se llama al Start() en ambos casos (3G/Wifi). ¿Es esto un problema con VideoView? ¿Hay alguna solución?

Editar 2

Los videos son procedentes de API de YouTube. Intenté usar transmisiones incrustadas y normales, así como la transmisión de menor calidad disponible (variando por video). Además, no creo que sea un problema de codificación ya que los mismos videos se reproducen correctamente usando Wifi.

Editar 1

También recibirá el siguiente resultado independientemente de vídeo wether reproducirá de acuerdo con Wifi o no el uso de 3G.

01-30 15:22:38.305: E/MediaPlayer(3831): error (1, -1) 
01-30 15:22:38.305: E/MediaPlayer(3831): callback application 
01-30 15:22:38.305: E/MediaPlayer(3831): back from callback 
01-30 15:22:38.309: E/MediaPlayer(3831): Error (1,-1) 

Según esta Link, estos errores significa lo siguiente (pienso):

/* 
Definition of first error event in range (not an actual error code). 
*/ 
const PVMFStatus PVMFErrFirst = (-1); 
/* 
Return code for general failure 
*/ 
const PVMFStatus PVMFFailure = (-1); 
/* 

/* 
Return code for general success 
*/ 
const PVMFStatus PVMFSuccess = 1; 
/* 

Además la adición de confusión.

+1

Parece que este problema afecta a [otros dispositivos] (http://code.google.com/p/android-youtube-player/issues/detail?id=7) – Zakaria

+0

@Zakaria Ah, sí. Gracias por señalar eso. –

+0

¿Puede decirnos también cuáles son los niveles API de sus dispositivos? Ese trabajo y eso no funciona. –

Respuesta

4

Sí, como está pensando, este es un problema en VideoView, problemas similares también aparecen en MediaPlayer, y me he encontrado con problemas similares y extraños como los que tuvo, tuve problemas cuando el video solo se reprodujo en 3G y no en Wi-Fi. Esto generalmente ocurre en 2.1 y algunos dispositivos 2.2, pero no en niveles de API más altos como he visto hasta ahora.

Entonces, ¿qué puedo recomendar es hacer lo siguiente:

En primer lugar comprobar si el dispositivo en funcionamiento puede ser uno que puede tener problemas, algo como esto:

//Define a static list of known devices with issues 
static List sIssueDevices=Arrays.asList(new String[]{"HTC Desire","LG-P500","etc"}); 

if(Build.VERSION.SDK_INT<9){ 
    if(sIssueDevices.contains(Build.Device){ 
     //This device may have issue in streaming, take appropriate actions 
    } 
} 

Así que esta fue la parte más simple, para detectar si el dispositivo en ejecución puede tener problemas al transmitir el video. Ahora, lo que hice y también puedo ayudarte, es almacenar el video de Youtube en un archivo en el archivo SDCard y configurar ese archivo como source para tu VideoView. Voy a escribir algunos fragmentos de código para ver cómo era mi enfoque: surgirá

private class GetYoutubeFile extends Thread{ 
    private String mUrl; 
    private String mFile; 
    public GetYotubeFile(String url,String file){ 
     mUrl=url; 
     mFile=file; 
    } 

    @Override 
    public void run() { 
     super.run(); 
     try { 

      File bufferingDir=new File(Environment.getExternalStorageDirectory() 
        +"/YoutubeBuff"); 

      File bufferFile=new File(bufferingDir.getAbsolutePath(), mFile); 
      //bufferFile.createNewFile(); 
      BufferedOutputStream bufferOS=new BufferedOutputStream(
             new FileOutputStream(bufferFile)); 

      URL url=new URL(mUrl); 
      URLConnection connection=url.openConnection(); 
      connection.setRequestProperty("User-Agent", "Mozilla"); 
      connection.connect(); 
      InputStream is=connection.getInputStream(); 
      BufferedInputStream bis=new BufferedInputStream(is,2048); 

      byte[] buffer = new byte[16384]; 
      int numRead; 
      boolean started=false; 
      while ((numRead = bis.read(buffer)) != -1 && !mActivityStopped) { 
       //Log.i("Buffering","Read :"+numRead); 
       bufferOS.write(buffer, 0, numRead); 
       bufferOS.flush(); 
       mBuffPosition += numRead; 
       if(mBuffPosition>120000 &&!started){ 
        Log.e("Player","BufferHIT:StartPlay"); 
        setSourceAndStartPlay(bufferFile); 
        started=true; 
       } 

      } 
      Log.i("Buffering","Read -1?"+numRead+" stop:"+mActivityStopped); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public void setSourceAndStartPlay(File bufferFile) { 
    try { 
     mPlayer.setVideoPath(bufferFile.getAbsolutePath()); 
     mPlayer.prepare(); 
     mPlayer.start(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Otra cuestión cuando el VideoView ha dejado de jugar antes del final del archivo, porque no hay suficiente se reguló en el archivo.Para ello es necesario establecer un onCompletionListener() y si no está al final del video, usted debe comenzar de nuevo la reproducción de vídeo desde la última posición:

public void onCompletion(MediaPlayer mp) { 
    mPlayerPosition=mPlayer.getCurrentPosition(); 
    try { 
     mPlayer.reset(); 
     mPlayer.setVideoPath(
      new File("mnt/sdcard/YoutubeBuff/"+mBufferFile).getAbsolutePath()); 
     mPlayer.seekTo(mPlayerPosition); 
     mPlayer.start(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

Al final, por supuesto, se inicia el hilo GetYoutubeFile en el onCreate() método:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //init views,player,etc 
    new GetYoutubeFile().start(); 
} 

Algunas modificaciones y adaptación creo que tendrá que ser hecho por este código, y puede que no sea el mejor enfoque, pero me ayudó, y no pude encontrar ninguna alternativa.

+0

no ha probado pero definitivamente un +1 a la lógica! Recién revisé este código de YouTubePlayer y noté algunos controles para WIFI. ¿Eso causaría un problema? Quiero decir, ¿estás seguro de que es un problema de VideoView? –

+0

No puedo decir que estoy 100% seguro. Pero ciertamente sé que el mismo video estaba trabajando en 3G y no en WiFi en algunos dispositivos, y viceversa en algunos otros dispositivos. Así que solo puedo pensar que es algo dentro de 'VideoView', y no un problema de formato de video. –

0

Este mensaje a menudo surge de la codificación inapropiada del video ("No se puede reproducir el video. Lo siento, este video no se puede reproducir.") Hace tiempo que estaba luchando con videoview, ahora los videos codificados funcionan en todos los dispositivos probados incluso cuando usas Wifi o 3G. Hágales saber si desea saber cómo codificar los videos. Y para transmitir los videos, utilicé la demo de android sdk apis y funciona perfectamente.

+0

Si este es el caso, ¿por qué los mismos videos funcionan en wifi? –

1

tengo abordar este problema en mi propia way.First cada vez que lea el registro de cat.If tienes

Error (1,-1) 

que significa que obtendrá sorry,this video can not play message .So en este caso, terminar esa actividad, dará personalizada barra de progreso y video de descarga. Luego de descargar, guárdelo en una carpeta temporal y luego reprodúzcalo. Después de reproducir, elimine esa carpeta.

Para gato registro de lectura ---

try { 
    Process process = Runtime.getRuntime().exec("logcat -d"); 
    BufferedReader bufferedReader = new BufferedReader(
    new InputStreamReader(process.getInputStream())); 
    StringBuilder log=new StringBuilder(); 
    String line; 
    while ((line = bufferedReader.readLine()) != null) { 
    log.append(line); 
    } 
} catch (IOException e) { 
} 

Leer esta respuesta también. aunque solo es experiencia de usuario no vinculada a la aplicación, pero sucede a veces en la aplicación predeterminada también

Montones de videos, incluso si tengo cobertura total de red 3G, dirán "Lo siento, este video no se puede reproducir". Un día, me cabreé tanto con eso, seguí presionando "Muy bien" para descartar el mensaje, y luego presioné el video nuevamente solo para ver nuevamente el mensaje "Lo sentimos, este video no se puede reproducir". Repetí este proceso (en mi ira ciega), pero finalmente, después de aproximadamente 5 intentos, ¡el video decidió jugar milagrosamente!

Este método funciona mucho para mí todo el tiempo. La mayoría de los videos no querrán jugar la primera vez, pero eventualmente si solo soy persistente, y sigo diciéndole que juegue aunque me diga que 'no' puede reproducir el video, ¡se reproducirá! Aunque, en algunos videos tuve que presionar 'Okay', presionar el video, presionar 'Okay', presionar el video, etc ... como 20 veces antes de que realmente decidiera jugar. Esas veces, he estado increíblemente cerca de conseguir mi teléfono y arrojarlo al suelo debido a lo mal que estoy con la forma en que youtube no funcionará.

Ojalá hubiera una manera de solucionar este problema. Nadie parece haber encontrado una solución. Todo el mundo simplemente dice "oh sí, tengo el mismo problema", pero nadie contribuye con nada. GOOGLE, SOLUCIONE ESTE PROBLEMA EN SUS TELÉFONOS. ESTO PARECE ESTAR SUCEDIENDO EN TODO EL MUNDO, EN UNA GAMA DE TELÉFONOS ANDROIDES.

+0

¿Estás satisfecho con mi respuesta? – Sameer

+0

No tiene que leer Logcat, puede adjuntar el método de devolución de llamadaErrorListner que le proporcionará estos errores –

+0

También puede hacerlo ... pero a veces no aparece enErrorListner – Sameer

Cuestiones relacionadas