【问题标题】:Strange Behavior of Android VideoView - "Can't Play Video"Android VideoView 的奇怪行为 - “无法播放视频”
【发布时间】:2011-10-18 11:09:28
【问题描述】:

在我的应用程序中,通过传递所选视频的文件路径,在不同 Activity 的 VideoView 中显示来自 sdcard 文件夹的视频或来自 Video intent 的新拍摄视频。

现在的问题是, 我已经在我的 2 台设备 LG Optimus Black and LG Optimus Me and it works 上测试了这个应用程序,就像魅力没有问题没有强制关闭。

现在当我在Samsung Fascinate 2.1 the video view shows the message "Can't Play Video" 测试这个应用程序时,无论我选择现有视频还是拍摄新视频。

请记住,该应用在上述 2 种设备上运行良好。

在 ShowVideo 活动中,我有上传视频的按钮,当我收到“无法播放视频”消息时,我能够从同一路径获取视频并上传它,并且可以在服务器上检查该视频侧面但视频视图没有播放该视频。

So, the Video Path of the SDCard is not the problem thats for sure.

also the Video are of .3gp or .mp4 format only so the format is also supported by android

.

我的问题是:

1) 何时出现“无法播放视频”消息? 2)解决方案是什么? 3) 我的申请中可能出现哪些错误?

这是我收到该消息时的 logcat 输出,但没有看到任何错误/异常。

I/ActivityManager( 2227): Starting activity: Intent { cmp=com.zoodigapp.zoodig/com.zoodigapp.media.ShowVideo (has extras) }
V/SettingsProvider( 2227): system <- value=1.0 name=font_scale
V/SettingsProvider( 2227): property: sys.settings_system_version=26
V/SettingsProvider( 2227): notifying: content://settings/system/font_scale
D/HardwareService( 2227): Brightness NATIVE setBacklightBrightness running. light: 2bightness ==> 30  mode:  1
D/NetworkLocationProvider( 2227): onDataConnectionStateChanged 6
D/MobileDataStateTracker( 2227): default Received state= CONNECTING, old= CONNECTING, reason= (unspecified), apnTypeList= *
D/AGPSManagerService( 2227): state: CONNECTING apnName: Verizon reason: null
D/dalvikvm( 3326): GC freed 2472 objects / 140504 bytes in 73ms
I/File    ( 3326): /sdcard/DCIM/Camera/video-2011-10-17-10-40-54.mp4
V/MediaStore( 3326): We probably run out of space, so create the thumbnail in memory.
I/MediaPlayerService( 2182): Use PV_PLAYER for url:/sdcard/DCIM/Camera/video-2011-10-17-10-40-54.mp4
E/MetadataDriver( 2182): MetadataDriver::setDataSource url file type is isAudiofile(0)
D/        ( 2182): SISO TEST registering PVMFRecognizerPluginFactory
D/        ( 2182): SISO TEST registering PVMFRecognizerPluginFactory success
E/MetadataDriver( 2182): isCommandSuccessful: Command id(0 and expected 0) and status (-17 and expected 1), data corruption (false) at state (4).
E/MetadataDriver( 2182): isCommandSuccessful: Command id(1 and expected 1) and status (-14 and expected 1), data corruption (false) at state (5).
E/MetadataDriver( 2182): captureFrame :  time = 0
E/MetadataDriver( 2182): captureFrame :  inputWidth = 0, inputHeight =0, bAspectratio=0, bResize=0
D/MediaUploader( 2492): UploadsQueue.getAllPending: elapsed msec=449
I/MediaUploader( 2492): UploadManager.uploadPendingItems: Found 1 items in queue.
I/Selected( 3326): =============Second
D/MediaUploader( 2492): isGphotosSynced: FALSE -- starting gphotos update refresh for -5709461173740324808
W/IInputConnectionWrapper( 3505): showStatusIcon on inactive InputConnection
I/copybit ( 2227): [createPP] fimc version : 50
I/MediaPlayerService( 2182): Use PV_PLAYER for url:/DCIM/Camera/video-2011-10-17-10-40-54.mp4
D/        ( 2182): SISO TEST registering PVMFRecognizerPluginFactory
D/        ( 2182): SISO TEST registering PVMFRecognizerPluginFactory success
D/        ( 2182): SISO TEST PVOMA1FFRecognizerFactory::CreateRecognizerPlugin()
D/        ( 2182): SISO TEST PVOMA1FFRecognizerFactory::CreateRecognizerPlugin() plugin found
D/        ( 2182): SISO TEST PVOMA1FFRecognizerFactory::DestroyRecognizerPlugin()
E/OsclDirectFileIO( 2182): [LargeFileSupport] OsclDirectFileIO::OpenFileOrSharedFd Error = -1
W/MediaPlayer( 3326): info/warning (1, 26)
E/PlayerDriver( 2182): Command PLAYER_SET_DATA_SOURCE completed with an error or info -4
E/MediaPlayer( 3326): SISO TEST MEDIA_ERROR
E/MediaPlayer( 3326): error (-4, -4)
W/PlayerDriver( 2182): PVMFInfoErrorHandlingComplete
V/MediaProvider( 2349): stopThumbWorkerSuspendTimer
V/MediaProvider( 2349): Resuming ThumbWorker
W/MediaProvider( 2349): Have message but no request?
I/System.out( 2647): interface name: null
I/MediaPlayer( 3326): Info (1,26)
E/MediaPlayer( 3326): Error (-4,-4)
D/VideoView( 3326): Error: -4,-4
D/MediaUploader( 2492): UploadManager.uploadPendingItems: Waiting for GPhotos sync
D/MediaUploader( 2492): UploadsQueue.getAllPending: elapsed msec=5
I/MediaUploader( 2492): UploadManager.uploadPendingItems: Found 1 items in queue.
I/POWER_OFF_TEST( 2227): mBatteryLevel = 38   mBatteryDecimalPoint = 1
D/MediaUploader( 2492): UploadsAsyncQueryHandler.notifiyDatabaseChangeListeners
D/MediaUploader( 2492): isGphotosSynced: FALSE -- update is in progress for -5709461173740324808
D/MediaUploader( 2492): UploadManager.uploadPendingItems: Waiting for GPhotos sync
D/MediaUploader( 2492): updateQueueState: RUNNING
I/GooglePlusOne( 2492): Starting new CAMERA_SYNC_CREATED request 1
I/ActivityManager( 2227): Displayed activity com.zoodigapp.zoodig/com.zoodigapp.media.ShowVideo: 1251 ms (total 1251 ms)
V/InputDevice( 2227): ID[0]=0 Dn (0=>1)
V/WindowManager( 2227): Dsptch >Window{47a67278 com.zoodigapp.zoodig/com.zoodigapp.media.ShowVideo paused=false}
D/dalvikvm( 2227): GC freed 4009 objects / 210024 bytes in 155ms
V/InputDevice( 2227): ID[0]=0 Up (1=>0)
V/WindowManager( 2227): Dsptch >Window{47a67278 com.zoodigapp.zoodig/com.zoodigapp.media.ShowVideo paused=false}
W/InputManagerService( 2227): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@47d89250
D/dalvikvm( 2492): GC freed 11952 objects / 682568 bytes in 171ms
D/dalvikvm( 2647): GC freed 7435 objects / 656456 bytes in 26ms
D/dalvikvm( 2647): GC freed 3079 objects / 498304 bytes in 60ms
I/System.out( 2647): interface name: null
I/GooglePlusOne( 2492): CAMERA_SYNC_CREATED request 1 completed with code=200
D/MediaUploader( 2492): onGphotosChange: sawError=false; errs=0; retry=Wed Dec 31 17:00:00 America/Boise 1969; expiry=Mon Oct 17 10:56:20 America/Boise 2011
D/MediaUploader( 2492): UploadsQueue.getAllPending: elapsed msec=17
I/MediaUploader( 2492): UploadManager.uploadPendingItems: Found 1 items in queue.
D/MediaUploader( 2492): isGphotosSynced: TRUE for -5709461173740324808
D/MediaUploader( 2492): existsInGphotos: false info=name=video-2011-10-17-10-40-54.mp4 fileUri=content://media/external/video/media/37 fileSize=2477915;
D/MediaUploader( 2492): UploadManager.uploadPendingItems: starting upload...
D/MediaUploader( 2492): UploadManager.upload: info=name=video-2011-10-17-10-40-54.mp4 fileUri=content://media/external/video/media/37 fileSize=2477915
I/NetworkStat( 2678): Network type: MOBILE
I/NetworkStat( 2678): -------- mobile data network is NOT available as of now
D/NotificationService( 2227): enqueueNotification :: notification.defaults = 0, Notification.DEFAULT_SOUND = 1, notification.sound = null
D/dalvikvm( 2492): GC freed 4032 objects / 238248 bytes in 49ms
I/dalvikvm-heap( 2492): Grow heap (frag case) to 6.708MB for 524304-byte allocation
D/dalvikvm( 2492): GC freed 291 objects / 13392 bytes in 58ms
D/MediaUploader( 2492): UploadsAsyncQueryHandler.notifiyDatabaseChangeListeners
D/MediaUploader( 2492): GlsAuthorizer.getAuthToken: authTokenType=lh2; account=dprichards@gmail.com;
D/MediaUploader( 2492): executeWithAuthRetry: starting httpClient.execute #1
D/dalvikvm( 2870): GC freed 555 objects / 24144 bytes in 269ms
I/System.out( 2492): interface name: null
V/InputDevice( 2227): ID[0]=0 Dn (0=>1)
V/WindowManager( 2227): Dsptch >Window{47cf6308 com.zoodigapp.zoodig/com.zoodigapp.media.ShowVideo paused=false}
V/InputDevice( 2227): ID[0]=0 Up (1=>0)
V/WindowManager( 2227): Dsptch >Window{47cf6308 com.zoodigapp.zoodig/com.zoodigapp.media.ShowVideo paused=false}
D/dalvikvm( 2647): GC freed 7301 objects / 659064 bytes in 78ms
I/System.out( 2647): interface name: null
I/System.out( 2647): interface name: null
I/System.out( 2647): interface name: null
D/dalvikvm( 2647): GC freed 2654 objects / 324016 bytes in 149ms
I/System.out( 2647): interface name: null
D/MediaUploader( 2492): getStatusCode: status=HTTP/1.1 200 OK
D/MediaUploader( 2492): getStatusCode: status=HTTP/1.1 200 OK
D/MediaUploader( 2492): UPLOAD_START: uploadUrl=https://picasaweb.google.com/data/upload/resumable/media/create-session/feed/api/user/default/albumid/camera-sync?xmlerrors=1&upload_id=AEnB2Uqe2bdvyx5p31Ta-sS4ytggj07_6-uiKG_hCOc6sT1u8eqhvr-8oZdUT1uPHxuAxXphUiJXyq-i_8YaJlT2YLholp__Sw
D/MediaUploader( 2492): UploadManager.onProgress
V/MediaUploader( 2492): UploadManager.progressUpdate: guid=1351689615505998240; bytes=0
D/dalvikvm( 2647): GC freed 920 objects / 202544 bytes in 53ms
D/dalvikvm( 2492): GC freed 7362 objects / 498448 bytes in 73ms
D/MediaUploader( 2492): UploadsAsyncQueryHandler.notifiyDatabaseChangeListeners
D/dalvikvm( 2492): GC freed 658 objects / 129232 bytes in 42ms
I/dalvikvm-heap( 2492): Grow heap (frag case) to 7.250MB for 262160-byte allocation
D/dalvikvm( 2492): GC freed 0 objects / 0 bytes in 41ms
D/dalvikvm( 2492): GC freed 92 objects / 135128 bytes in 30ms
I/dalvikvm-heap( 2492): Grow heap (frag case) to 7.621MB for 524304-byte allocation
D/dalvikvm( 2492): GC freed 0 objects / 0 bytes in 44ms
D/MediaUploader( 2492): executeWithAuthRetry: starting httpClient.execute #1
D/dalvikvm( 2647): GC freed 576 objects / 53240 bytes in 182ms
V/InputDevice( 2227): ID[0]=0 Dn (0=>1)
V/WindowManager( 2227): Dsptch >Window{47cf6308 com.zoodigapp.zoodig/com.zoodigapp.media.ShowVideo paused=false}
V/InputDevice( 2227): ID[0]=0 Up (1=>0)
V/WindowManager( 2227): Dsptch >Window{47cf6308 com.zoodigapp.zoodig/com.zoodigapp.media.ShowVideo paused=false}
I/ActivityManager( 2227): Starting activity: Intent { cmp=com.zoodigapp.zoodig/.WriteMessage (has extras) }

如果你发现有什么不好描述的,请在下面评论。

附加细节(从 cmets 移出):

  • 它们只有 1 分钟,而我在三星上测试并失败的最后一个只有 20 秒。目前,大小大多以 MB 为单位,不超过 20 MB。
  • 该视频是从同一设备拍摄的,拍摄该视频后,我立即尝试在我的活动中以同样的方式显示其他已存储的视频也很好...实际上在上传该视频后,我可以看到该视频并且还可以下载

【问题讨论】:

  • 我发现应用this answer 使我能够获得可播放格式的视频。 Here is what I did.
  • @Suragch 这是一个非常棒的答案,我已经赞成,但在问题的情况下,用户正在拍摄视频并播放它,那么如何在播放之前或保存时通过代码执行 ffmpeg 内容。选择的答案仍然是上述问题的赢家,因为除非您使用自己的媒体框架来捕捉和播放视频,否则没有解决方案。

标签: android android-videoview


【解决方案1】:

1)出现“无法播放视频”的消息时?

Android 通常会在无法播放媒体内容时发出此消息。发生这种情况的原因可能是

  • 不支持的文件格式
  • 不支持的编解码器
  • 错误内容

仅举几例。

2) 解决方案是什么?

除非你的应用中有自己的媒体框架,否则从应用层面没有解决方案

3) 我的申请中可能出现哪些错误?

错误不太可能出现在您的应用程序中。如果您阅读日志,您会看到错误似乎源自 opencore 的 DataSource(您运行的是哪个版本的 android?它仍然使用 Opencore 而不是 StageFright)。它将其识别为一个大文件 (> 2GB),因此发出错误“E/OsclDirectFileIO(2182): [LargeFileSupport] OsclDirectFileIO::OpenFileOrSharedFd Error = -1

另外需要注意的是,某些手机的多媒体功能比其他手机更好,因为 OEM 可以自己提高多媒体功能。所以没有书面保证所有文件都可以在所有设备上播放,即使它符合支持的格式,Android 提到的编解码器。

【讨论】:

  • 只有3个原因,而android给出这样的消息?
  • 不,错误的数量非常多,简单地说,如果媒体框架无法为给定的媒体内容构建媒体图,那么它就会给出错误。
  • 好的,谢谢...告诉我是否出现此问题..这是开发人员的错还是设备的错?
  • 您是指应用开发者?那么不,他对此无能为力。
  • ok..thanx Ravi..让我在这方面做更多的努力,然后将您的答案标记为已接受
【解决方案2】:

都是格式问题,有些手机录制的视频是mp4格式,有些是3gp格式,但几乎所有手机默认的媒体播放器都支持3gp格式。所以解决的办法就是在玩的时候需要把它转成3gp。这东西在 android 中很难处理,所以在服务器端你可以很容易地做到这一点,因此无论上传什么格式的视频,你都可以以一种 .3gp 格式下载它,它可以正常工作。

【讨论】:

  • 我想我不太明白,看看你的 LG 设备是否以 .3gp 格式记录它,在 LG 设备中播放文件不会有任何问题。您的意思是您的默认媒体播放器也无法播放您通过 LG 相机录制的文件?
  • 默认播放器会播放..但 VideoView 不播放。
  • 哦,我在谈论默认媒体播放器的问题,例如,当我们从爱立信上传视频时,它将采用 .mp4 格式,因此大多数三星手机即使在默认情况下也不支持它,所以我们需要更改 .3gp 格式,大多数默认媒体播放器都支持这一点。很抱歉没有正确理解。
  • 没关系..你已经给出了将来可能有用的解决方案..]
【解决方案3】:

确保您的视频是 MP4 格式,但如果仍然无法播放或显示相同的错误,则说明代码不存在故障。故障在于视频分辨率。只需检查视频的高度和宽度并将其与您的视频视图组件匹配。有很多免费的在线视频压缩器可用。因此,只需压缩您的视频并进行测试。

它会起作用的。 干杯!!!

【讨论】:

    【解决方案4】:

    在尝试播放手机本身的视频时,我一直收到相同的“无法播放视频”消息。首先,我没有输入好的文件路径,但还有另一个有趣的问题。

    1. 我从根目录输入路径,例如 /videoFileName.mp4,我应该在 /sdcard/videoFileName.mp4 之间输入 sdcard >

    2. 在我通过 adb 运行我的应用程序的同时,我的 Sony Ercisson Xperia Arc 作为 USB 大容量设备存储连接,因此内部 sd 卡被卸载并且找不到文件。当我在三星 Galaxy S 上尝试相同的代码时,我发现了这一点,它在连接时的行为不同。

    【讨论】:

    • 我是,总是得到“无法播放视频”。因为我以“USB 调试模式”连接手机以在手机上推送代码,但在 SE 上使用某些设置卸载 sdcard,因此视频不存在!
    • 好的。但在我的情况下,视频仍然存在,我得到了错误。
    【解决方案5】:

    如果您有具有 H.264 基线编码的 mp4 文件,但仍然无法在您的 android 设备中播放视频,那么服务器端的 .htAccess 文件可能有问题。它可能正在压缩 .mp4 文件。很少有设备能够通过解压缩并流式传输视频来播放视频,但并非在所有设备情况下都如此。您需要在服务器端更改 .htAccess 文件。更改输出过滤器并包含文件格式 .mp4 以在流式传输时将其排除在 zip 之外。

    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|swf|mp4)$ \ no-gzip dont-vary
    

    【讨论】:

    • 你能告诉我.htAccess文件的路径吗?
    • @ArpitPatel 您需要启用“显示隐藏文件”,它将位于根目录中。如果它不存在...创建它。我花了将近两天的时间,我认为这是我的视频格式,一直降低它,然后我从另一个播放的链接下载了一个视频,当我将该视频放在我的服务器上时它没有播放。所以问题必须在服务器端。
    【解决方案6】:

    Google 最近在 Google IO 2014 之后开源了 Exoplayer。 到目前为止,我的视频播放体验非常好。

    https://github.com/google/ExoPlayer

    • 我可以从 Dropbox/AWS 流式传输视频
    • 从 youtube 流式传输视频。

    事情仍然取决于设备支持的编解码器

    【讨论】:

    • 感谢您的回答!
    • 您是否尝试过使用 ExoPlayer 流式传输 HLS m3u8 文件?对我来说,它不起作用,尽管 Android 支持 HLS。
    【解决方案7】:

    我在使用 VideoView 时遇到了同样的问题,当我尝试检查有关视频的所有内容时,问题出在 AndroidManifest.xml 文件中,这是关于使用EXTERNAL STORAGE 的权限,试一试它可能会解决问题。

    【讨论】:

      【解决方案8】:

      我遇到了同样的问题,因为我从 url 获取视频,所以我在清单文件中添加了 Internet 权限。

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

      这就是我填充视频列表视图的方式。

         //assign video
          mVideosListView = (ListView) findViewById(R.id.videoListView);
      
          //create videos
          Video riverVideo = new Video("https://s3.amazonaws.com/androidvideostutorial/862009639.mp4");
          Video carsVideo = new Video("https://s3.amazonaws.com/androidvideostutorial/862013714.mp4");
          Video townVideo = new Video("https://s3.amazonaws.com/androidvideostutorial/862014159.mp4");
          Video whiteCarVideo = new Video("https://s3.amazonaws.com/androidvideostutorial/862014159.mp4");
          Video parkVideo = new Video("https://s3.amazonaws.com/androidvideostutorial/862014834.mp4");
          Video busyCityVideo = new Video("https://s3.amazonaws.com/androidvideostutorial/862017385.mp4");
      
          mVideosList.add(riverVideo);
          mVideosList.add(carsVideo);
          mVideosList.add(townVideo);
          mVideosList.add(whiteCarVideo);
          mVideosList.add(parkVideo);
          mVideosList.add(busyCityVideo);
      
          /***populate video list to adapter**/
          mVideoAdapter = new VideoAdapter(this, mVideosList);
          mVideosListView.setAdapter(mVideoAdapter);
      

      【讨论】:

        【解决方案9】:

        我曾经遇到过同样的问题。就我而言,唯一的问题是 fie 格式。我刚刚将视频格式更改为 .mp4,它在我使用的所有设备和模拟器上都像魅力一样工作。 我的建议是先检查您的视频格式,然后尝试其他解决方案。

        【讨论】:

          【解决方案10】:

          对我来说,视频使用的编解码器有问题。 我安装了 Any Video Converter 并使用 Google Android (x264) 的设置转换了视频。 现在我可以在所有设备上玩了。

          【讨论】:

            【解决方案11】:

            我的问题是我将它保存为 .avi 格式而不是 .m4v 格式,它在我的三星上运行起来就像一个魅力......感谢大家的帮助!

            【讨论】:

              猜你喜欢
              • 2012-11-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-12-20
              • 2014-11-02
              • 1970-01-01
              相关资源
              最近更新 更多