简体   繁体   English

Android:无法播放mp4视频

[英]Android: cannot play mp4 video

I'm trying to play mp4 videos streaming from a server using native VideoView , sadly I keep getting a " Cannot play video " error. 我正在尝试使用原生VideoView从服务器播放mp4视频流 ,遗憾的是我不断收到“ 无法播放视频 ”错误。

The weird thing is that the same video plays well on Froyo but will not play on HoneyComb. 奇怪的是,同样的视频在Froyo上播放效果不错,但不会在HoneyComb上播放。 I tried the same video with MX Video Player (on HC) and it plays just fine. 我用MX Video Player(在HC上)尝试了相同的视频,它播放得很好。

Another major problem is that I cannot re-encode the videos, so I have to use the videos as they are. 另一个主要问题是我无法对视频进行重新编码,因此我必须按原样使用这些视频。

  • What is causing the error? 是什么导致错误?
  • How can I play the video? 我该如何播放视频?
  • Should I find a way to include a codec library into my app? 我应该找到一种方法将编解码器库包含到我的应用程序中吗?

Below are details from logcat: 以下是logcat的详细信息:

E/MediaExtractor(  242): **********MediaExtractor::Create
D/DivXPlugin(  241): DivXPlugin::onInitialize : 75
D/DivXPlugin(  241): DivXPlugin::onSetOnInfoListener : 75
D/DivXPlugin(  241): DivXPlugin::onOpenDecryptSession: Enter : 75
E/DivXPlugin(  241): DivXPlugin::onOpenDecryptSession() Not a Divx File.
E/DrmManager(Native)(  241): DrmManager::openDecryptSession: no capable plug-in found
D/DivXPlugin(  241): DivXPlugin::onTerminate : 75
E/MediaExtractor(  242): ************Autodetected media content as 'video/mpeg4' with confidence 0.40
D/AwesomePlayer(  242): finishSetDataSource_l getDrmInfo
D/AwesomePlayer(  242): setDataSource_l
E/MPEG4Extractor(  242): ftyp chunk found
D/MPEG4Extractor(  242): kKeyAVCC found
E/MPEG4Extractor(  242): ERROR_MALFORMED because ret=-108
E/MPEG4Extractor(  242): return ERROR_UNSUPPORTED
E/MPEG4Extractor(  242): return ERROR_UNSUPPORTED
D/AwesomePlayer(  242): UNKNOWN_ERROR: no Video and no Audio
D/AwesomePlayer(  242): abortPrepare
D/AwesomePlayer(  242): notifyListener_l
E/MediaPlayer( 3906): error (1, -2147483648)
E/MediaPlayer( 3906): Error (1,-2147483648)
D/VideoView( 3906): Error: 1,-2147483648

And the specs of the video that cannot be played: 以及无法播放的视频规格:

General
    Format                           : MPEG-4
    Format profile                   : Base Media
    Codec ID                         : isom
    File size                        : 60.7 MiB
    Duration                         : 7mn 3s
    Overall bit rate mode            : Variable
    Overall bit rate                 : 1 201 Kbps
    Writing application              : Lavf52.37.0

    Video
    ID                               : 1
    Format                           : AVC
    Format/Info                      : Advanced Video Codec
    Format profile                   : High@L3.1
    Format settings, CABAC           : Yes
    Format settings, ReFrames        : 4 frames
    Codec ID                         : avc1
    Codec ID/Info                    : Advanced Video Coding
    Duration                         : 7mn 3s
    Duration_FirstFrame              : 40ms
    Bit rate                         : 1 072 Kbps
    Width                            : 1 024 pixels
    Height                           : 576 pixels
    Display aspect ratio             : 16:9
    Frame rate mode                  : Constant
    Frame rate                       : 25.000 fps
    Color space                      : YUV
    Chroma subsampling               : 4:2:0
    Bit depth                        : 8 bits
    Scan type                        : Progressive
    Bits/(Pixel*Frame)               : 0.073
    Stream size                      : 54.2 MiB (89%)
    Writing library                  : x264 core 65 r0+1016 dbc5ef0
    Encoding settings                : cabac=1 / ref=4 / deblock=1:0:0 / analyse=0x3:0x113 / me=umh / subme=8 / psy_rd=1.0:0.0 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / chroma_qp_offset=-2 / threads=6 / nr=0 / decimate=1 / mbaff=0 / bframes=16 / b_pyramid=0 / b_adapt=1 / b_bias=0 / direct=3 / wpredb=1 / keyint=125 / keyint_min=25 / scenecut=40(pre) / rc=2pass / bitrate=1072 / ratetol=1.0 / qcomp=0.80 / qpmin=10 / qpmax=51 / qpstep=4 / cplxblur=20.0 / qblur=0.5 / ip_ratio=1.41 / pb_ratio=1.25 / aq=1:1.00
    Language                         : English

    Audio
    ID                               : 2
    Format                           : AAC
    Format/Info                      : Advanced Audio Codec
    Format profile                   : LC
    Codec ID                         : 40
    Duration                         : 7mn 3s
    Bit rate mode                    : Variable
    Bit rate                         : 122 Kbps
    Channel(s)                       : 2 channels
    Channel positions                : Front: L R
    Sampling rate                    : 48.0 KHz
    Compression mode                 : Lossy
    Stream size                      : 6.18 MiB (10%)
    Language                         : English

The problem might be with the video encoding. 问题可能出在视频编码上。 Android FROYO and Gingerbread doesn't support H264 formats other than "Baseline" H264. 除了“Baseline”H264之外,Android FROYO和Gingerbread不支持H264格式 So if your video is Mp4 & H264 encoded make sure its "AVC baseline" encoded. 因此,如果您的视频是Mp4和H264编码,请确保其“AVC基线”编码。 Use some tools like "Media info" in windows/Linux and check your video encoding. 在Windows / Linux中使用“媒体信息”等工具,检查视频编码。

Some Froyo devices (eg, Samsung Galaxy Tab) use the OpenCore mediaframework while others use Stagefright. 一些Froyo设备(例如,三星Galaxy Tab)使用OpenCore媒体框架,而其他设备使用Stagefright。 From gingerbread all devices to my knowledge use Stagefright. 从姜饼所有设备到我的知识都使用Stagefright。 So this could maybe explain your experience. 所以这可以解释你的体验。

When playing over HTTP or RSTP there are additional constraints for the video container. 在通过HTTP或RSTP播放时,视频容器还有其他限制。

from the developer docs: 来自开发人员文档:

For 3GPP and MPEG-4 containers, the moov atom must precede any mdat atoms, but must succeed the ftyp atom. 对于3GPP和MPEG-4容器,moov原子必须在任何mdat原子之前,但必须接替ftyp原子。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM