关于android与Iphone录MP4格式视频播放问题

本文介绍了作者在开发中遇到的Android录制的MP4视频无法在iPhone上播放的问题,通过研究发现是H.264编码级别问题。通过使用CamcorderProfile设置档次为LOW,成功解决播放兼容性问题。分享这一解决方案,希望能帮助遇到同样问题的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天遇到android录制MP4格式视频,到IPhone上播放不了的问题,经多方搜索没有找到问题所在,

最初android端使用的是 Mediarecoder 默认的简单设置,代码如下:


recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoSize(640, 480);
recorder.setVideoFrameRate(30);
recorder.setVideoEncodingBitRate(5 * 1024 * 1024);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);


用此方法录制的视频没有任何问题,无论在其他任何设备上播放都没有问题,但是到了IPhone上就会无法播放(其他的苹果设备没有测试过),

最终IPhone的开发人员给了一个问题原因:

在iphone4 下不能播放avc level超过3.1的。把avc的编码的等级改成baseline L3.1 的或者改成high L3.1的录成的mp4文件都可以在iphone4 下播放


一开始,我的想法就是研究这个 avc 和 baseline@L3.1 代表的是什么,于是我就开始各种百度,博客转来转去,在一位大神的博客中找到了相关的说明

http://www.cnblogs.com/zyl910/archive/2011/12/08/h264_level.html

在这里我才有点了解到这个是 H.264 的编码中画质级别,大神是这么说的:对于H.264(MPEG-4 AVC)而言,级别(Level)是与档次(Profile)同等重要的参数。

于是我对自己的代码有进行了一番尝试,首先我更改胃不痛的编码格式,语音的编码格式,发现没有效果


如图所示(视频文件详细信息可以到PC播放器里查看文件属性看到),视频在IPhone上依然无法播放,于是我就在想怎样可以把这个 Format profile 的级别修改掉,

于是我又到 Mediarecoder 的源码中,API中翻看,发现了一个有趣的东西,CamcorderProfile profile ,对应之前大神的描述 profile (档次),于是我进到里面去看看,

发现Mediarecoder也是可以通过 profile 来进行设置的,在 CamcorderProfile 中也有对应的属性,于是我开始修改代码:

recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);
profile.videoFrameWidth = 640;
profile.videoFrameHeight = 480;
profile.fileFormat = MediaRecorder.OutputFormat.MPEG_4;
profile.videoCodec = MediaRecorder.VideoEncoder.H264;
profile.audioCodec = MediaRecorder.AudioEncoder.AMR_NB;
profile.videoFrameRate = 15;

recorder.setProfile(profile);


与之前直接对Mediarecoder进行设置对比,设置都是一样的,但是生成的 MP4 格式的视频可以在IPhone上播放了,

于是我又对profile.videoFrameWidth 和 profile.videoFrameHeight 按照之前大神博客中对应的画质级别进行了修改,生成了不同级别的视频

   

还有一个 Baseline@L3.0 的,这两个文件都是可以播放的,于是问题解决了。



总结:鄙人只是一个android不足一年的小白,第一次摸索着写博客,遇到这个问题怎么都没有找到准确的解决方案,android也有好多的东西我没接触过的,

虽然我解决了这个对大神来说的小问题,但是我对视频录制播放等等的方面了解还是很有限的,这只是一个参考的方法,因为网上找了很多地方没有,

所以分享出来给大家作参考。

真—总结:如果直接对Mediarecoder进行设置,画质的级别是修改不了的,但是对 CamcorderProfileprofile(档次?)进行设置的话,可以根据具体的设置,

自己就会对画质等级进行修改,更深层次的东西,小白我是在是不懂了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值