Android VideoView的奇怪行为 – “无法播放video”

在我的应用程序中,通过传递所选video的文件path,在不同Activity中显示来自sdcard文件夹的video或来自VideoView的video意图的新拍摄video。

现在的问题是,我testing了这个应用程序在我的2个设备LG Optimus Black and LG Optimus Me and it works像魅力没有问题没有力量closures。

现在,当我在Samsung Fascinate 2.1 the video view shows the message "Can't Play Video"testing这个应用程序Samsung Fascinate 2.1 the video view shows the message "Can't Play Video"无论我select现有的video或采取新的。

请记住,上述2个设备的应用程序工作正常。

在ShowVideo活动中,我有上传video的button,当我收到消息“无法播放video”时,我能够从相同的path获取video并上传video,并可以在服务器端检查video, t播放了那个video

 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)当“不能播放video”信息出现时? 2)有什么解决scheme? 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) } 

如果您发现任何未描述的内容,请在下面评论。

其他细节(从评论中移除):

  • 他们只有1分钟,而我在三星testing的最后一个只有20秒。 而且大小现在大都是以MB为单位不超过20 MB。
  • 该video是从同一设备采取,并立即采取该video后,我尝试以同样的方式显示其他已经存储的video也很好…实际上传后,我可以看到video,也可以下载

Solutions Collecting From Web of "Android VideoView的奇怪行为 – “无法播放video”"

1)当“不能播放video”信息出现时?

当Android无法播放媒体内容时,Android通常会发出此消息。 造成这种情况的原因可能是类似的

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

提几个。

2)有什么解决scheme?

除非在应用程序中有自己的媒体框架,否则应用程序级别没有解决scheme

3)在我的应用程序中可能会出现什么错误?

你的应用程序中的错误不太可能发生。 如果你读了日志,你会发现这个错误似乎来源于opencore的DataSource(你运行的是哪个版本的Android?它仍然使用Opencore而不是StageFright)。 它认为它是一个大文件(> 2GB),因此发出错误“ E / OsclDirectFileIO(2182):[LargeFileSupport] OsclDirectFileIO :: OpenFileOrSharedFd Error = -1

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

它的所有格式问题,有些手机录制的MP4格式和一些3GP格式的video,但几乎所有手机的默认媒体播放器支持3gp格式。 所以解决scheme是你需要在播放的时候把它转换成3gp。 这个东西很难在android中处理,所以在服务器端你可以很容易地做到这一点,因此无论上传的video格式,你可以下载一个格式.3gp,它会正常工作。

在尝试从手机本身播放video的过程中,我总是收到相同的“无法播放video”消息。 首先,我没有input一个好的文件path,但有一个有趣的问题。

  1. 我已经从根键入path,例如/videoFileName.mp4 ,我应该键入与之间的SD卡像/sdcard/videoFileName.mp4

  2. 我的Sony Ercisson Xperia Arc作为一个usb海量设备存储连接,同时我通过adb运行我的应用程序,因此内部sd卡被卸载,无法find文件。 当我在三星Galaxy S上尝试使用相同的代码时,我发现了这一点。

Google最近在Google IO 2014之后开放了Exoplayer。我的video播放体验还不错。

https://github.com/google/ExoPlayer

  1. 我可以从Dropbox / AWSstream式传输video
  2. 从YouTubestreamvideo。

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

如果你有mp4文件有H.264基线编码,仍然无法在你的android设备上播放video,那么它可能是服务器端.htAccess文件中的问题。 它可能是压缩.mp4文件。 很less有设备能够通过解压缩video来播放video,而不是在所有的设备情况下。 您需要在服务器端更改.htAccess文件。 更改输出filter,并包含文件格式.mp4,以便在stream式传输时将其从zip中排除。

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

我在使用VideoView的时候遇到了同样的问题,而我试图在AndroidManifest.xml文件中检查所有关于video的问题,这是关于使用EXTERNAL STORAGE的权限给它一个镜头,可能会解决这个问题。

确保你的video是MP4格式的,但是如果仍然没有播放或者显示相同的错误,那么错误不在代码中。 video分辨率出现故障。 只要检查你的video的高度和宽度,并与你的video查看组件匹配。 有很多免费的在线video压缩器。 所以只要压缩你的video并testing它。

它会工作。 干杯!!!

我遇到了同样的问题,因为我从url获取video,所以我的工作是将Internet权限添加到清单文件。

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

这是我如何填充video的列表视图。

  //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); 

在这里输入图像说明

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

我的问题是我已经保存在.avi格式而不是.m4v格式,它的工作喜欢我的三星魅力…感谢大家的帮助!