Android MediaRecorder H264 编码实时视频流不能播放(readInt()值太大)以及如何将流实时上传到服务器的方法
2013-08-09 21:47
1006 查看
请先仔细阅读/article/1688675.html后再阅读本文
核心是/article/1688675.html,用博主的方法录制视频后许多人发现无法播放,主要问题是 DataInputStream的readInt()方法读取的值太大(之后会提到),readInt()是用来读取四个字节并以十进制表示这四个字节代表的数值
我们先来看看MediaRecorder使用H264编码的具体情况,问题就处在这里
PS: CSDN 的代码排版真是越来越坑爹了
核心是/article/1688675.html,用博主的方法录制视频后许多人发现无法播放,主要问题是 DataInputStream的readInt()方法读取的值太大(之后会提到),readInt()是用来读取四个字节并以十进制表示这四个字节代表的数值
我们先来看看MediaRecorder使用H264编码的具体情况,问题就处在这里
PS: CSDN 的代码排版真是越来越坑爹了
//获取SPS和PPS public class GetSPSAndPPS { private byte[] SPS; private byte[] PPS; private final int PARA_SPS = 0; private final int PARA_PPS = 1; public GetSPSAndPPS(byte[] in){ int dataLength = in.length; // 'a'=0x61, 'v'=0x76, 'c'=0x63, 'C'=0x43 byte[] avcC = new byte[] { 0x61, 0x76, 0x63, 0x43 }; // avcC的起始位置 int avcRecord = 0; for (int ix = 0; ix < dataLength; ++ix) { if (in[ix] == avcC[0] && in[ix + 1] == avcC[1] && in[ix + 2] == avcC[2] && in[ix + 3] == avcC[3]) { // 找到avcC,则记录avcRecord起始位置,然后退出循环。 avcRecord = ix + 4; break; } } if (0 == avcRecord) { handleMainThread("Cannot find avvC"); return; } int spsStartPos = avcRecord + 6; byte[] spsbt = new byte[] { in[spsStartPos], in[spsStartPos + 1] }; int spsLength = bytes2Int(spsbt); SPS = new byte[spsLength]; spsStartPos += 2; System.arraycopy(in, spsStartPos, SPS, 0, spsLength); int ppsStartPos = spsStartPos + spsLength + 1; byte[] ppsbt = new byte[] { in[ppsStartPos], in[ppsStartPos + 1] }; int ppsLength = bytes2Int(ppsbt); PPS = new byte[ppsLength]; ppsStartPos += 2; System.arraycopy(in, ppsStartPos, PPS, 0, ppsLength); handleMainThread("Find SPS and PPS!"); } private int bytes2Int(byte[] bt) { int ret = bt[0]; ret <<= 8; ret |= bt[1]; return ret; } public byte[] getParameter(int type) { switch(type){ case PARA_SPS: return SPS; case PARA_PPS: return PPS; default:return null; } } private void handleMainThread(String s) { Message msg = new Message(); Bundle b = new Bundle(); b.putString("String", String.valueOf(s)); msg.setData(b); try { RAS_MAIN.myhandle.sendMessage(msg); } catch (Exception e) { System.out.print(e.getMessage()); } } }
相关文章推荐
- spydroid-ipcamera 实现Android视频实时上传到服务器,服务器可以实时浏览
- HTML5上传视频无法播放以及兼容的解决方法
- 在网页中插入FLV格式的视频在本地预览中能播放,上传到服务器就不能播放
- [流媒体]Android 实时视频采集/编码/传输/解码/播放—方案调研(初)
- android实时录制视频h263编码通过rtp打包udp发送到服务器
- Android 如何使用juv-rtmp-client.jar向Red5服务器发布实时视频数据
- asp.net Flv视频在本地能播放上传服务器不能播放
- Android 实时视频采集/编码/传输/解码/播放—方案调研
- ssm框架中,上传的资料存放在另外一台ftp服务器中是如何实现的?以及编码问题
- Android中VideoView播放视频不能充满屏幕以及视频上的view与视频不同步显示的问题
- Android平台美颜相机/Camera实时滤镜/视频编解码/影像后期/人脸技术探索——2.4 滤镜以及配套代码的制作方法
- 【流媒體】Android 实时视频采集/编码/传输/解码/播放—方案调研(初)
- Android 实时视频采集/编码/传输/解码/播放—方案调研
- 本地可以播放的.flv视频,上传服务器后不能播放的解决方案
- 本地可以播放的.flv视频,上传服务器后不能播放的解决方案
- 如何在Chrome播放 RTSP 实时视频,并且不能有插件
- android视频开发之一Android 如何使用juv-rtmp-client.jar向Red5服务器发布实时视频数据
- 【流媒體】Android 实时视频采集/编码/传输/解码/播放—方案调研(初)
- 为什么FLV格式文件上传服务器后不能播放? .FLV视频上传到服务器上不能播放的原因与解决办法
- 上传到独立服务器上的视频不能在线播放的解决妙招