MediaCodec ES流
来源:互联网 发布:软件开发模式有几种 编辑:程序博客网 时间:2024/06/18 06:02
Android自带的MediaCodec Sample使用MediaCodec+MediaExtrator可以实现视频播放,但不支持ES流的播放。MediaExtractor不能读取ES流, MediaCodec输入为NAL,所以需要自己写个函数来分解出各个NAL。
先说ES文件的提取,我们摄像机默认录像文件为asf文件,从中提取ES流。以下命令的意义不是太清楚,也是网上超来的,实际可用。命令a应该是分解出ES流,命令b应该是重现再打包,还是ES流
命令a:ffmpeg -i hi.asf -vcodec copy -an -f m4vtest.264
命令b:ffmpeg -i test.264 -vcodec h264 -s1920*1080 -an -f m4v t.264
书上说,可以根据文件中的00 00 01序列作为边界来提取每个NAL。
使用命令a提取的 SPS、I帧、P帧为00 00 00 01,SEI、PPS为00 00 01.使用命令b再编码后的SPS、I、P、SEI、PPS都为00 00 00 01。原因不太了解,实测发现:1、无论添加多少个0,都是没问题的。2、将SPS PPS SEI I帧作为一帧一起输入MediaCodec与将三者分别输入效果是一样的。,
分离NAL的函数,需要注意的是,如果每次都去读存储会很慢,需要尽量一次多读点缓冲。
public int nextFrame2(ByteBuffer buffer){ int size = 0; byte[] b_array= new byte[1];// Log.d("myapp","nextFrame"); int stage = 0; try { if(!has_find_frame_head) { while (true) { getByteFromCache(b_array);// Log.d("myapp", "b=" + b_array[0]); if (stage == 0 ) { if(b_array[0] == 0) { stage = 1;// buffer.put(b_array[0]);// size++; }else{ stage=0;// buffer.clear();// size = 0; } } else if (stage == 1) { if (b_array[0] == 0) { stage = 2;// buffer.put(b_array[0]);// size++; } else { stage = 0;// buffer.clear();// size = 0; } } else if (stage == 2) { if (b_array[0] == 1) {// buffer.put(b_array[0]);// size++; break; } else if (b_array[0] == 0) { stage = 2;// buffer.put(b_array[0]);// size++; } else { stage = 0;// buffer.clear();// size = 0; } } } } size = 3; byte b = 0; buffer.put(b); b=0; buffer.put(b); b=1; buffer.put(b); has_find_frame_head = false; //has find start flag 001 or 0001 or 0000001 while(true){// inputStream.read(b_array); getByteFromCache(b_array); buffer.put(b_array[0]); if(size >=2 && buffer.get(size)==1 && buffer.get(size - 1)==0 && buffer.get(size-2)==0) { has_find_frame_head = true; size -= 2; break; }else { size++; } } }catch (Exception e){ e.printStackTrace(); return 0; }// Log.d("myapp","size="+size); if(size<=0) EOS=true; return size; }
0 0
- MediaCodec ES流
- MediaCodec解码h264流
- Mediacodec
- MediaCodec
- Android使用MediaCodec解码视频并用OpenGL ES进行渲染的思路
- MediaCodec硬编码成H264视频流
- Mediacodec获得视频流,写入H264文件
- 使用MediaCodec和RTMP做直播推流
- MediaCodec Sample
- MediaCodec Demo
- MediaCodec类
- MediaCodec类
- MediaCodec 实例
- MediaCodec Demo
- MediaCodec总结
- MediaCodec Demo
- MediaCodec Demo
- Android MediaCodec
- 用一个数组表示两个栈,只要数组有空间,往栈中添加元素就能成功
- Python error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat)解决方案
- POJ 3164 Command Network
- Git学习笔记(1)——基本操作指令
- 网络原理学习1
- MediaCodec ES流
- Linux系统中xorg.conf文件简介
- ReactiveCocoa框架菜鸟入门——信号(Signal)详解 第一课:什么是 ReactiveCocoa
- linux驱动开发—基于Device tree机制的驱动编写
- try catch finally 用法
- new Handler().post(new Runnalbe()... 分析
- bzoj 2242 [sdoi2011]计算器 (BSGS)
- JavaSE程序分析001 继承的小事情
- ReactiveCocoa框架菜鸟入门——信号(Signal)详解 第二课:信号(Signal)的各种操作