【问题标题】:Video won't play with Android's native MediaPlayer, however it plays with Dropbox's video player视频无法使用 Android 的原生 MediaPlayer 播放,但可以使用 Dropbox 的视频播放器播放
【发布时间】:2012-11-23 08:12:08
【问题描述】:

我在使用 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" />

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

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 的视频播放器可以正常播放。

根据 ffmpeg 的 ffprobe 工具,我可以验证媒体类型对 Android 来说不是奇特的东西。

Dropbox 是否在执行一些奇怪的转码伏都教,有没有办法让我以类似的方式进行这项工作?

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

【问题讨论】:

  • 可以直接播放SD卡的视频吗?
  • 任何可能只是一个身份验证问题,即视频不是公开的,因此 Dropbox 应用程序可以访问它,因为它已登录,但不是作为原始 URL 传递给另一个 Android没有 Dropbox 登录会话的组件?
  • 不太可能,因为我故意将视频公开,并且可以从新的浏览器会话中访问它。似乎涉及 URL 重定向(logcat 中的保管箱 URL 不同),但将其设置为其中任何一个都没有区别。

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


【解决方案1】:

由于我既没有投递箱应用程序源,也没有访问实际文件的权限,所以我将根据几个假设做出最好的猜测。

本机应用程序无法播放该文件,因为它的格式无法在那里播放。你能说下载文件,把它放在sd卡里然后播放吗?如果不支持,则手机不支持此格式。

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

另一个可能的猜测: 您正在尝试对 3gp 文件进行流式播放,这是不可能的。HTTP pd 播放可能是可能的。再次,下载它并从sd卡播放它,如果它播放,那么可能就是这个问题。 这个文件可能没有提示它需要是什么。

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

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

编辑:看到的问题:Nexus S 不会在本地或从 http 链接播放给定文件。事实证明,重新混合到 mp4 使得 Nexus S 可以双向播放。这意味着某些 android 设备的本地原生播放器中不存在 3gp 支持。

【讨论】:

  • 感谢您的回复,我也将把它归结为 Dropbox voodoo。我特意把视频文件公开了做进一步分析,是不是无法访问? dropbox.com/s/zpiqwmxka6llavt/SketchyFile.3gp
  • 你试过用本地sd卡播放吗?将其下载到您的手机并播放。如果您尝试在 3gp 上进行流式传输,它将无法正常工作。该文件是可访问的。没有暗示。因此,如果您正在执行伪流式传输,则可能需要提示。如果没有提示 3gp 文件并且播放器不支持伪流,则尝试使用 3gp 文件播放 http 链接将不起作用。
  • 从 SD 卡在本地播放是不确定的,它在 Galaxy S2 上播放,但在 Nexus S 上播放不了(但它在两者上都使用 dropbox 播放)。你最后的评论让我走上了正确的轨道。该文件似乎位于 mov 容器中,而不是 mp4 容器中,据我所知,它无法通过 http 可靠地流式传输。
  • Nachi,即使是 mp4 也无法流式传输,除非它是伪流式传输。我认为你的问题是它没有被暗示。
  • 顺便说一句,Nexus S 不能用原生播放器播放,我也可以确认。如果重新混合为 mp4 文件,它会从 sd 卡播放,并作为来自另一台服务器的 http 链接播放(这两者在以前都是不可能的。)这仅仅意味着您的 drop box 应用程序具有对 natvie 播放器不具备的 3gp 的本机支持。跨度>
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-11-02
    • 2011-10-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多