关于android与Iphone录MP4格式视频播放问题
2015-04-01 09:40
375 查看
这几天遇到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(档次?)进行设置的话,可以根据具体的设置,
自己就会对画质等级进行修改,更深层次的东西,小白我是在是不懂了。
最初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(档次?)进行设置的话,可以根据具体的设置,
自己就会对画质等级进行修改,更深层次的东西,小白我是在是不懂了。
相关文章推荐
- 关于android视频播放开发中 播放视频只有声音没有图像的问题解决方案
- 关于android视频播放显示区域不正常的问题,一些处理方法
- 关于iphone自动播放音频和视频问题的解决办法
- 关于Android中使用WebView播放网络视频不能全屏的问题
- 全屏录制播放控件--Android 开发中关于视频录制和播放的诸多问题处理
- 关于在iPhone上播放视频的问题
- [置顶] Android 视频播放横屏布局错乱问题
- 关于实现背景为自动循环播放、无声的、宽度自适应视频的相关问题
- 关于Android 支持 4K 视频显示的问题总结
- Android WebView页面结束后视频播放还有声音问题
- android webview 播放视频 全屏问题
- 解决Android7.0系统 调用系统相机、系统播放器播放视频、切图兼容问题,报异常android.os.FileUriExposedException
- Android 录制的mp4视频文件在IOS中无法播放问题
- Android 百度云媒体 等播放器播放4:3等多种比例的视频 大小配置的问题
- Android开发笔记——视频录制播放常见问题
- Android 机顶盒开发播放视频有声音无图像问题
- Android中使用WebView全屏播放视频时home键不起作用的问题解决
- Android Webview中解决H5的音视频不能自动播放、只有声音没有图像的问题
- 关于openfire的android音/视频聊天的方案问题
- 关于Unity3D VideoPlayer播放视频中的声音的问题