Подтвердить что ты не робот

Потоковое видео в VideoView работает только на Wi-Fi при использовании телефонов Samsung

Я использую следующую библиотеку для потоковой передачи видео YouTube в приложение для Android.

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

Я успешно могу воспроизводить видео на телефонах HTC и Motorola через 3G и Wi-Fi. Однако на телефонах Samsung Galaxy (Epic 4G) и Samsung Galaxy II я могу играть только с Wi-Fi. 3G дает мне эту ошибку: "Невозможно воспроизвести видео. Извините, что это видео невозможно воспроизвести".

Я пытался использовать низкокачественные потоки YouTube, но это не помогло. Я вижу в своем журнале, что Start() вызывается в обоих случаях (3G/Wifi). Это проблема с VideoView? Есть ли способ обхода?

Изменить 2

Видеоролики поступают из API YouTube. Я попытался использовать встроенные и обычные потоки, а также доступ к потоку с самым низким качеством (в зависимости от видео). Кроме того, я не думаю, что это проблема с кодировкой, поскольку одни и те же видео воспроизводятся правильно, используя Wifi.

Изменить 1

Я также получаю следующий вывод независимо от того, сколько видео воспроизводится с использованием Wi-Fi или не использует 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)

В соответствии с этой ссылкой эти ошибки означают следующее (я думаю):

/*
 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;
/*

Дальнейшее добавление путаницы.

4b9b3361

Ответ 1

Да, как вы думаете, это проблема в VideoView, похожие проблемы также появляются в MediaPlayer, и я столкнулся с подобными и странными проблемами, как и вы, у меня были проблемы, когда видео воспроизводилось только на 3G, а не на Wi-Fi. Обычно это происходит на 2.1 и некоторых 2.2 устройствах, но не на более высоких уровнях API, как я видел до сих пор.

Поэтому я могу порекомендовать следующее:

Сначала проверьте, может ли работающее устройство быть тем, у кого могут быть проблемы, например:

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

Итак, это была самая простая часть, чтобы определить, могут ли запущенные устройства возникать при потоковой передаче видео. Теперь, что я сделал, а также может помочь вам, буфера видео с Youtube в файле на SDCard и установите этот файл как source для вашего VideoView. Я напишу фрагменты кода, чтобы узнать, как мой подход:

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

Еще одна проблема возникнет, когда VideoView перестанет играть до конца файла, поскольку в файле недостаточно буферизации. Для этого вам нужно установить onCompletionListener(), и если вы не находитесь в конце видео, вы должны снова запустить воспроизведение видео с последней позиции:

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

}

В конце концов, конечно, поток GetYoutubeFile запускается в методе onCreate():

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

Некоторые модификации и адаптация, я думаю, придется сделать для этого кода, и это может быть не лучший подход, но мне это помогло, и я не мог найти альтернативы.

Ответ 2

У меня есть проблема с этой проблемой по-своему. Сначала каждый раз читайте свой журнал cat.If вы получили

Error (1,-1) 

это означает, что вы получите sorry,this video can not play message. В этом случае завершите это действие, дайте пользовательский индикатор выполнения и загрузите видео. Затем, после загрузки, сохраните его во временной папке, затем воспроизведите его. После воспроизведения удалите эту папку.

Для чтения журнала cat ---

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

Прочитайте этот ответ. хотя это просто пользовательский опыт, не связанный с app.but иногда это происходит в приложении по умолчанию также

Кучи видео, даже если у меня есть полное покрытие сети 3G, скажут "Извините, это видео невозможно воспроизвести". Однажды, я так разозлился, я просто продолжал нажимать "Хорошо" , чтобы отклонить сообщение, а затем снова нажал на видео, чтобы снова увидеть сообщение "Извините, это видео не может быть воспроизведено". Я повторил этот процесс (в моем слепом гневе), но в конце концов, примерно через 5 попыток видео решил чудесным образом сыграть!

Этот метод работает для меня каждый раз. Большинство видеороликов не захотят играть в первый раз, но в конце концов, если я просто настойчив и продолжаю рассказывать об этом, даже если он говорит мне, что "не может" воспроизводить видео, он будет играть! Хотя, некоторые видеоролики, которые я должен был нажать "Хорошо" , нажмите на видео, нажмите "Хорошо" , нажмите видео и т.д., Например, 20 раз, прежде чем он решил играть. В те времена я был невероятно близок к тому, чтобы получить свой телефон и выбросить его на пол из-за того, насколько я держусь с тем, как youtube не будет работать.

Я хочу, чтобы был способ исправить эту проблему. Кажется, никто не придумал решение. Все просто говорят: "О да, у меня такая же проблема", но никто ничего не вносит. GOOGLE, РЕШИТЕ ​​ЭТУ ПРОБЛЕМУ НА ТЕЛЕФОНЫ. ЭТОТ СЕМЬЯ ПРОЙДЕТ ВСЕМУ МИРУ, НА ДИАПАЗОНЕ АНДРОИДНЫХ ТЕЛЕФОНОВ.

Ответ 3

Это сообщение часто ссылается на неподходящую кодировку видео ( "Невозможно воспроизвести видео. Извините, что это видео невозможно воспроизвести" ). Я некоторое время боролся с видеовидео, теперь правильные закодированные видеоролики воспроизводятся на всех тестируемых устройствах, даже при использовании Wi-Fi или 3G. Пусть em знает, хотите ли вы знать, как кодировать видео. И для потоковой передачи видео я использовал демо от android sdk apis, и он работает безупречно.