视频无法与Android的原生MediaPlayer一起播放,但它与Dropbox的视频播放器一起播放

时间:2012-12-05 13:26:01

标签: android ffmpeg video-streaming media-player dropbox

我在使用Android的MediaPlayer播放某个.3gp文件(来自Dropbox链接)时遇到问题。然而,该文件可以毫无问题地从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" />

给出了“无法播放此视频”错误。

error-screenshot

Logcat显示:

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-success-screenshot

根据ffmpeg的ffprobe工具,我可以验证媒体类型不是Android的特色。

Dropbox是否会执行一些奇怪的转码巫术,有没有办法以类似的方式使这项工作成功?

编辑:这里还有一些insight into DropBox's encoding voodoo

2 个答案:

答案 0 :(得分:3)

由于我既没有下拉框应用程序源代码,也没有访问实际文件,这是我最好的猜测,我会根据几个假设做出来。

本机应用无法播放该文件,因为它的格式无法在那里播放。你能说下载文件,把它放在SD卡然后播放吗?如果没有,那么手机不支持这种格式。

为什么Dropbox播放器会播放它?我基于同样假设的猜测是,drop box播放器在jni下面添加了自己的解码库(例如ffmpeg)。所以它可以解码这个。

另一种可能的猜测: 您正在尝试进行3gp文件的流式播放,这是不可能的.HTTP pd播放可能是可能的。再次,下载它并从SD卡播放,如果它播放,那么可能这是问题。 此文件可能不会被暗示它需要。

Drop box正在播放这个,因为也许Dropbox应用程序通过其他api以某种方式访问​​文件末尾(你的伏都教)的标题?

以上两点都是我所看到的常见问题的猜测,因为我既没有Dropbox应用程序源,也没有访问您的文件或确切知道您是如何使用本机播放器播放视频的。可能上述提示之一有帮助。祝你好运!

编辑:发现问题:Nexus S不在本地或从http链接播放给定文件。结果是对于mp4的重新调整使Nexus S发挥了它的双向作用。这意味着在某些Android设备中本地原生播放器中没有3gp支持。

答案 1 :(得分:-1)

您可以使用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
}