Видео не будет воспроизводиться с помощью собственного MediaPlayer Android, однако оно воспроизводится с помощью видеоплеера Dropbox.

У меня возникли проблемы с воспроизведением определенного файла .3gp (по ссылке Dropbox) с помощью Android MediaPlayer. Однако файл волшебным образом без проблем воспроизводится из приложения Dropbox для Android.

Я пытаюсь воспроизвести это, используя это:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.dropbox.com/s/zpiqwmxka6llavt/SketchyFile.3gp"));
startActivity(intent);

и мой манифест содержит

<uses-permission android:name="android.permission.INTERNET" />

который дает ошибку «Не удается воспроизвести это видео».

скриншот ошибки

Логкат показывает:

I/NuCachedSource2(89): new range: offset= 2245017
I/ChromiumHTTPDataSource(89): connect to https://dl.dropbox.com/0/view/a1crokuhpprsaeo/SketchyFile.3gp @2245017
I/NuCachedSource2(89): ERROR_END_OF_STREAM
E/MediaPlayer(3629): error (1, -2147483648)
E/MediaPlayer(3629): Error (1,-2147483648)
D/VideoView(3629): Error: 1,-2147483648

Если я попытаюсь воспроизвести его из приложения Dropbox для Android, видеоплеер Dropbox без проблем воспроизведет его.

dropbox-успех-скриншот

Согласно инструменту ffprobe от ffmpeg, я могу убедиться, что тип носителя не является чем-то экзотическим для Android.

Использует ли Dropbox какое-то странное перекодирование вуду, и есть ли способ заставить это работать аналогичным образом?

РЕДАКТИРОВАТЬ: вот еще несколько понимания вуду кодирования DropBox.


person Nachi    schedule 05.12.2012    source источник
comment
Можете ли вы воспроизводить видео прямо с SD-карты?   -  person mbwasi    schedule 05.12.2012
comment
Есть ли шанс, что это просто проблема аутентификации, т. Е. Видео не является общедоступным и поэтому доступно для приложения Dropbox с момента входа в систему, но не в виде необработанного URL-адреса, переданного другому компоненту Android, у которого нет сеанса входа в Dropbox?   -  person Chris Stratton    schedule 07.12.2012
comment
Маловероятно, так как я намеренно сделал видео общедоступным и могу получить к нему доступ из нового сеанса браузера. Похоже, что задействовано перенаправление URL-адресов (URL-адрес dropbox в logcat отличается), но установка любого из них не имеет значения.   -  person Nachi    schedule 10.12.2012


Ответы (2)


Поскольку у меня нет ни исходного кода приложения Dropbox, ни доступа к фактическому файлу, вот мое лучшее предположение, которое я сделаю на основе нескольких предположений.

Файл не воспроизводится родным приложением, потому что он имеет формат, который там не воспроизводится. Можете ли вы сказать, скачать файл, положить его на SD-карту, а затем воспроизвести? Если нет, то телефон не поддерживает этот формат.

Почему в дропбокс плеер играет? Мое предположение, основанное на том же предположении, заключается в том, что проигрыватель drop box добавляет свою собственную библиотеку декодирования (например, ffmpeg ) вместе с ней ниже jni. Так что он может расшифровать это.

Еще одно возможное предположение: вы пытаетесь воспроизвести потоковое воспроизведение файла 3gp, что невозможно. Возможно воспроизведение HTTP pd. Опять же, скачайте его и воспроизведите с SD-карты, если он воспроизводится, то, вероятно, проблема в этом. Этому файлу может быть не указано, каким он должен быть.

Dropbox воспроизводит это, потому что, возможно, приложение dropbox каким-то образом получает доступ к заголовку, который находится в конце файла (ваше вуду) через какой-то другой API?

Опять же, оба вышеперечисленных являются предположениями из общих проблем, которые я вижу, поскольку у меня нет ни источника приложения dropbox, ни доступа к вашему файлу, ни точного знания того, как вы пытаетесь воспроизвести видео с помощью собственного проигрывателя. Возможно, один из приведенных выше советов поможет. Удачи!

РЕДАКТИРОВАТЬ: Проблема замечена: Nexus S не воспроизводит данный файл локально или по http-ссылке. Оказалось, что ремуксирование в mp4 заставило Nexus S воспроизводить его в обоих направлениях. Это означает, что поддержка 3gp отсутствует в локальном родном плеере на некоторых устройствах Android.

person av501    schedule 10.12.2012
comment
Спасибо за ваш ответ, я тоже собираюсь списать это на вуду Dropbox. Я намеренно сделал видеофайл общедоступным для дальнейшего анализа, он не доступен? dropbox.com/s/zpiqwmxka6llavt/SketchyFile.3gp - person Nachi; 11.12.2012
comment
Пробовали ли вы играть с локальной SD-карты? Загрузите его на свой телефон и играйте. Если вы пытаетесь сделать потоковую передачу по 3gp, это не сработает. Файл доступен. Это не намек. Поэтому может потребоваться подсказка, если вы выполняете псевдопотоковую передачу. Попытка воспроизвести http-ссылку с 3gp-файлом не сработает, если 3gp-файл не хинтован и плеер не поддерживает псевдопоток. - person av501; 11.12.2012
comment
Воспроизведение локально с SD-карты было безрезультатным, оно воспроизводилось на Galaxy S2, но не на Nexus S (однако оно воспроизводилось на обоих с помощью Dropbox). Ваш последний комментарий поставил меня на правильный путь, хотя. Похоже, что файл находится внутри контейнера mov, а не mp4, который, насколько я понимаю, не может быть надежно передан через http. - person Nachi; 11.12.2012
comment
Начи, даже mp4 нельзя транслировать, если это не псевдопоток. Я думаю, ваша проблема в том, что это не намекается. - person av501; 11.12.2012
comment
Кстати, Nexus S не воспроизводит его с родным плеером, это я тоже могу подтвердить. Если ремультировать в файл mp4, он воспроизводится с SD-карты и как http-ссылка с другого сервера (оба из которых были невозможны ранее). Это просто означает, что ваше приложение Drop Box имеет встроенную поддержку 3gp, которой нет у natvie player. - person av501; 11.12.2012
comment
Потрясающий! Какие параметры ffmpeg вы использовали? - person Nachi; 11.12.2012

Вы можете использовать try-catch следующим образом:

try
{
  VideoView videoView = (VideoView) findViewById(R.id.VideoView);         
  MediaController mediaController = new MediaController(this);
  mediaController.setAnchorView(videoView);
  // Set Audio/Video
  String strfilename = "http://example.com/video.mp4";
  Uri video = Uri.parse(strfilename);
  videoView.setMediaController(mediaController);
  videoView.setVideoURI(video);
  videoView.start();   
} 
catch (Exception e) 
{
  //enter code here
  //Handle Errors
} 
person Ram    schedule 12.11.2014