Android:无法播放 mp4 视频
Posted
技术标签:
【中文标题】Android:无法播放 mp4 视频【英文标题】:Android: cannot play mp4 video 【发布时间】:2011-12-22 10:14:34 【问题描述】:我正在尝试使用本机 VideoView 从服务器播放 mp4 视频流,遗憾的是我不断收到“无法播放视频”错误。
奇怪的是,相同的视频在 Froyo 上播放良好,但在 HoneyComb 上却无法播放。 我用 MX 视频播放器(在 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 时长:700万3秒 整体比特率模式:可变 总比特率:1 201 Kbps 编写应用程序:Lavf52.37.0 视频 编号:1 格式:AVC 格式/信息:高级视频编解码器 格式配置文件:High@L3.1 格式设置,CABAC:是 格式设置,ReFrames:4 帧 编解码器 ID:avc1 编解码器 ID/信息:高级视频编码 时长:700万3秒 Duration_FirstFrame : 40 毫秒 比特率:1 072 Kbps 宽度:1 024 像素 高度:576 像素 显示纵横比:16:9 帧率模式:恒定 帧速率:25.000 fps 色彩空间:YUV 色度二次采样:4:2:0 位深:8位 扫描类型:逐行扫描 比特/(像素*帧):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 / 格子=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 英语语言 声音的 编号:2 格式:AAC 格式/信息:高级音频编解码器 格式配置文件:LC 编解码器 ID:40 时长:700万3秒 比特率模式:可变 比特率:122 Kbps 频道:2 个频道 通道位置:前:L R 采样率:48.0 KHz 压缩模式:有损 流大小:6.18 MiB (10%) 英语语言
【问题讨论】:
我正在考虑将 ffmpeg 库添加到我的应用程序中,但我对 android NDK 知之甚少。任何人有提示或链接提供? 【参考方案1】:问题可能出在视频编码上。 Android FROYO 和 Gingerbread 不支持 "Baseline" H264 以外的 H264 格式。因此,如果您的视频是 Mp4 和 H264 编码,请确保其“AVC 基线”编码。在 windows/Linux 中使用“媒体信息”等工具并检查您的视频编码。
【讨论】:
【参考方案2】:一些 Froyo 设备(例如,三星 Galaxy Tab)使用 OpenCore 媒体框架,而其他设备则使用 Stagefright。从姜饼到我所知道的所有设备都使用 Stagefright。所以这也许可以解释你的经历。
通过 HTTP 或 RSTP 播放时,视频容器有额外的限制。
来自开发者文档:
对于 3GPP 和 MPEG-4 容器,moov atom 必须位于任何 mdat 之前 原子,但必须在 ftyp 原子之后。
【讨论】:
以上是关于Android:无法播放 mp4 视频的主要内容,如果未能解决你的问题,请参考以下文章