Потоковая передача в VideoView воспроизводится только на Wi-Fi при использовании телефонов Samsung - PullRequest
12 голосов
/ 31 января 2012

Я использую следующую библиотеку для потоковой передачи видео 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

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

Редактировать 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;
/*

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

Ответы [ 3 ]

4 голосов
/ 15 февраля 2012

Да, как вы думаете, это проблема в 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();
}

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

1 голос
/ 16 февраля 2012

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

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.но иногда это происходит в приложении по умолчанию

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

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

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

0 голосов
/ 07 февраля 2012

Это сообщение часто исходит из неправильной кодировки видео («Невозможно воспроизвести видео. Извините, это видео не может быть воспроизведено».) Некоторое время я боролся с видеовидом, теперь правильное закодированное видео воспроизводится на всех протестированных устройствах, даже при использовании Wi-Fi или 3G. Дайте им знать, если вы хотите знать, как кодировать видео. И для потокового видео я использовал демо от Android SDK apis, и он работает безупречно.

...