安卓VideoView的奇怪行为 - "无法播放视频"

26

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

现在问题是,我已经在我的两个设备LG Optimus Black和LG Optimus Me上测试了这个应用程序,并且它像魅力一样工作,没有问题也没有强制关闭。

现在当我在Samsung Fascinate 2.1上测试这个应用程序时,无论我选择现有的视频还是拍摄新视频,视频视图都会显示消息“无法播放视频”。

请记住,该应用程序在上述两个设备上正常工作。

在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) }

如果你发现有任何描述不清的地方,请在下面评论。

附加详细信息(从评论中移动):

  • 它们仅为1分钟,我最后测试失败的那个视频只有20秒,并且大小大多在MB而不是超过20MB。
  • 该视频是从同一设备拍摄的,并且在拍摄完该视频后,我尝试以与其他已存储视频相同的方式在我的活动中显示,实际上,在上传该视频后,我可以看到该视频并且也可以下载。

我发现应用这个答案使我能够以可播放的格式获取视频。这是我所做的。 - Suragch
@Suragch,你的回答非常好,我已经点赞了。但是在这个问题中,用户正在拍摄视频并播放它,那么如何在播放或保存时通过代码执行ffmpeg操作呢?尽管没有解决方案,但仍然可以使用自己的媒体框架来捕获和播放视频,因此上面的答案仍然是获胜者。 - MKJParekh
11个回答

23

1) 当出现“无法播放视频”消息时怎么办?

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

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

等等。

2) 有什么解决方法?

除非您在应用程序中拥有自己的媒体框架,否则从应用程序级别没有解决方案。

3) 我的应用程序可能存在哪些错误?

很少有可能是您的应用程序出错了。如果您阅读日志,您将看到错误似乎起源于opencore的数据源(您正在运行哪个版本的Android?它仍在使用Opencore而不是StageFright)。它识别为大型文件(> 2GB),因此会显示错误“E/OsclDirectFileIO( 2182): [LargeFileSupport] OsclDirectFileIO::OpenFileOrSharedFd Error = -1”。

另一个需要注意的事情是,某些手机的多媒体功能比其他手机更好,因为OEM可以自己提高多媒体功能。因此,虽然符合Android支持的格式和编解码器,但并不能保证所有文件都可以在所有设备上播放。


不,错误数量相当大,简单地说,如果媒体框架无法为给定的媒体内容构建媒体图,则会出现该错误。 - bluefalcon
7
您是指应用程序开发者吗?那么不,他无法解决这个问题。 - bluefalcon
我遇到了同样的问题,一个可以在webview的<video>标签中正常播放的视频链接,在我的VideoView中却出现了错误。这仍然不是开发者的错吗? - ohcibi
我不知道为什么这个答案被接受为最佳答案。它没有提供任何解决方案。 - Mansour Fahad
我之所以遇到这个错误,是因为我的视频来自互联网,而我忘记在AndroidManifest.xml中添加权限。例如:<uses-permission android:name="android.permission.INTERNET" /> - Logic1
显示剩余3条评论

4

这是一个关于格式问题的问题,一些手机记录视频时采用mp4格式,而另一些则采用3gp格式,但几乎所有手机的默认媒体播放器都支持3gp格式。因此,在播放时需要将其转换为3gp格式。在Android系统中处理这个问题很困难,因此可以在服务器端轻松地解决它,无论上传的视频格式如何,您都可以下载.3gp格式并正常使用。


我觉得我没有理解好,看看你的LG设备是否以.3gp格式记录它,这样在LG设备中播放文件就不会有问题了。你的默认媒体播放器无法播放你用LG相机录制的文件吗? - PiyushMishra
默认播放器会播放..但是VideoView却无法播放。 - MKJParekh
好的,我在谈论默认媒体播放器的问题,例如当我们从爱立信上传视频时,它将以.mp4格式存在,因此大多数三星手机甚至在默认情况下也无法支持它,所以我们需要将其更改为.3gp格式,大多数默认媒体播放器都支持这种格式。抱歉我没有正确理解它。 - PiyushMishra
没关系,你提供的解决方案可能在将来会有用。 - MKJParekh

3

请确保您的视频格式为MP4,但如果仍无法播放或显示相同错误,则故障不在代码中。问题出在视频分辨率上。只需检查您的视频的高度和宽度,并将其与您的视频视图组件匹配即可。有许多免费的在线视频压缩器可供使用。因此,只需压缩您的视频并进行测试。

这样就可以解决问题了。 干杯!!!


2
如果您有一个使用H.264基线编码的mp4文件,但在Android设备上仍然无法播放视频,则可能是服务器端的.htAccess文件出了问题。这个问题可能是由于对.mp4文件进行压缩造成的。一些设备可以通过解压缩并流式传输来播放视频,但并非所有设备都可以。您需要更改服务器端的.htAccess文件。更改输出过滤器并包含文件格式.mp4以在流式传输时将其排除在压缩之外。
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|swf|mp4)$ \ no-gzip dont-vary

你能告诉我 .htAccess 文件的路径吗? - Arpit Patel
@ArpitPatel 你需要启用“显示隐藏文件”,它将在根目录中。如果不在那里...就创建一个。 我花了将近两天的时间,以为是我的视频格式问题,一直在降低它,然后我从另一个链接下载了一个可以播放的视频,当我把那个视频放到我的服务器上时,它却无法播放。所以问题必须是服务器端的。 - Niana

2
Google在2014年的Google IO大会之后开源了Exoplayer。到目前为止,我使用它播放视频的经验非常好。

https://github.com/google/ExoPlayer

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

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


感谢您的回答! - MKJParekh
你尝试过使用ExoPlayer流式传输HLS m3u8文件吗?对我来说,它不起作用,尽管Android支持HLS。 - Micky

2

我一直在尝试播放手机上的视频,但一直收到相同的“无法播放视频”消息。开始时,我没有输入正确的文件路径,但仍然存在另一个有趣的问题。

  1. 我从根目录键入了路径,例如/videoFileName.mp4,但我应该将其与sdcard连接,像这样/sdcard/videoFileName.mp4

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


1
我总是得到“无法播放视频”的提示。因为我将手机连接到电脑上,以"USB调试模式"推送代码到手机,但在某些设置下,SE会卸载SD卡,所以视频文件不在那里! - Nemanja Kovacevic
2
好的。但在我的情况下,视频仍然存在,我收到了错误。 - MKJParekh

1

我遇到了同样的问题,解决方法是在清单文件中添加Internet权限,因为我正在从URL获取视频。

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

enter image description here


1

当我使用VideoView时,遇到了同样的问题。在检查视频相关的所有内容时,问题出现在AndroidManifest.xml文件中。它涉及到使用外部存储的权限,请尝试一下,这可能会解决问题。


1

我曾经遇到过相同的问题。在我的情况下,唯一的问题是文件格式。我只是将视频格式更改为.mp4,在我使用的所有设备和模拟器上都可以完美运行。 我的建议是首先检查您的视频格式,然后尝试其他解决方案。


-1
对我来说,视频使用的编解码器是个问题。 我安装了 Any Video Converter 并使用 Google Android(x264)的设置转换了视频。 现在我可以在任何设备上播放它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接