安卓:无法播放mp4视频

5
我正在尝试使用本地的VideoView从服务器播放mp4视频流,但遗憾的是我一直收到“无法播放视频”的错误信息。 奇怪的是,相同的视频在Froyo上播放得很好,但在HoneyComb上却无法播放。 我尝试在MX Video Player(在HC上)中使用相同的视频,它可以正常播放。 另一个主要问题是我不能重新编码这些视频,所以我必须按原样使用这些视频。
- 是什么导致了错误? - 如何播放视频? - 我应该找到一种方法将解码库包含到我的应用程序中吗?
下面是来自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

以下是无法播放的视频规格:

    通用
    格式                             : MPEG-4
    格式配置                         : 基础媒体
    编解码器 ID                      : isom
    文件大小                         : 60.7 MiB
    持续时间                         : 7mn 3s
    总比特率模式                     : 可变
    总比特率                         : 1 201 Kbps
    写入应用程序                     : Lavf52.37.0
视频 ID : 1 格式 : AVC 格式/信息 : 高级视频编解码器 格式配置 : High@L3.1 格式设置,CABAC : 是 格式设置,参考帧数 : 4 frames 编解码器 ID : avc1 编解码器 ID/信息 : 高级视频编解码 持续时间 : 7mn 3s 第一帧持续时间 : 40ms 比特率 : 1 072 Kbps 宽度 : 1 024 pixels 高度 : 576 pixels 显示宽高比 : 16:9 帧速率模式 : 恒定 帧速率 : 25.000 fps 色彩空间 : YUV 色度抽样 : 4:2:0 每像素比特数 : 8 bits 扫描类型 : 渐进式 每像素比特数/帧 : 0.073 流大小 : 54.2 MiB (89%) 写入库 : x264 core 65 r0+1016 dbc5ef0 编码设置 : 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 语言 : 英语
音频 ID : 2 格式 : AAC 格式/信息 : 高级音频编解码器 格式配置 : LC 编解码器 ID : 40 持续时间 : 7mn 3s 比特率模式 : 可变 比特率 : 122 Kbps 声道数 : 2 channels 声道布局 : 前置: L R 采样率 : 48.0 KHz 压缩模式 : 损失压缩 流大小 : 6.18 MiB (10%) 语言 : 英语

我在考虑将FFmpeg库添加到我的应用程序中,但我对Android NDK知之甚少。有人能提供提示或链接吗? - sebataz
2个回答

1
问题可能出在视频编码上。Android FROYO和Gingerbread不支持除“基线”H264之外的其他H264格式。因此,如果您的视频是Mp4&H264编码,请确保其为“AVC基线”编码。使用一些工具,如Windows / Linux中的“媒体信息”,检查您的视频编码。

0

一些Froyo设备(例如三星Galaxy Tab)使用OpenCore媒体框架,而其他设备则使用Stagefright。从Gingerbread开始,所有设备都使用Stagefright。这可能可以解释您的经验。

在通过HTTP或RSTP播放时,视频容器有额外的限制。

来自开发人员文档:

对于3GPP和MPEG-4容器,moov原子必须在任何mdat原子之前,但必须在ftyp原子之后。


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