【流媒体】 Android 实时视频编码—H.264硬编码
【流媒體】 Android 实时视频编码—H.264硬编码
SkySeraph Apr 4th 2012
Email:skyseraph00@163.com
1 硬编码 & 软编码
硬编码:通过调用Android系统自带的Camera录制视频,实际上是调用了底层的高清编码硬件模块,也即显卡,不使用CPU,速度快
软编码:使用CPU进行编码,如常见C/C++代码,一般编译生成的二进制都是的,速度相对较慢。例如使用Android NDK编译H264生成so库,编写jni接口,再使用java调用so库。
2 原理
① 过程:通过MediaRecoder采集视频,再将视频流映射到LocalSocket实现收发
② 原理:详见【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流 和 “【流媒體】Android 实时视频采集—MediaRecoder录制 ”
3 核心代码
① MediaRecoder视频采集
视频采集采用了MediaRecorde录制方式,详见 “【流媒體】Android 实时视频采集—MediaRecoder录制 ”
② 在initiativeVideo中setOutputFile设置以流方式输出

// 设置输出文件方式: 直接本地存储 or LocalSocket远程输出
if (bIfNativeORRemote == true) // Native
{
lVideoFileFullPath = strRecVideoFilePath + String.valueOf(System.currentTimeMillis())
+ lVideoFileFullPath;
mRecVideoFile = new File(lVideoFileFullPath);
// mMediaRecorder.setOutputFile(mRecVideoFile.getAbsolutePath());
mMediaRecorder.setOutputFile(mRecVideoFile.getPath()); // called after set**Source before prepare
Log.i(TAG, "start write into file~");
}
else // Remote
{
mMediaRecorder.setOutputFile(sender.getFileDescriptor()); // 设置以流方式输出
Log.i(TAG, "start send into sender~");
}

③ startRecording
功能:通过这个函数启动线程实现视频流映射到LocalSocket,同时实现编码
private void startRecording()
{
Log.i(TAG, "##startRecording....");
new Thread(this).start();
}
run:

@Override
public void run()
{
Log.i(TAG, "##run...."); // defines
DataInputStream dataInputStream = null;
int offSet=0,tmp=0,beLeft=0; try
{
dataInputStream = new DataInputStream(receiver.getInputStream());
} catch (IOException e2)
{
// TODO Auto-generated catch block
e2.printStackTrace();
}
try
{
Thread.currentThread().sleep(500);
} catch (InterruptedException e1)
{
e1.printStackTrace();
} // ①方式一:通过查看预先录制的视频,需要跳过mdat前面32个字节(不同硬件平台不同!)
try
{
dataInputStream.read(h264frame, 0, 32);
Log.i(TAG, "read mdat from");
} catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
// ②方式二:自动化查找(待补充) try
{
h264FileOutputStream = new FileOutputStream("/sdcard/avss/h264.264");//264码流
Log.i(TAG, "h264FileOutputStream");
} catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
try
{
h264FileOutputStream.write(h264head);
h264FileOutputStream.write(h264sps);
h264FileOutputStream.write(h264head);
h264FileOutputStream.write(h264pps);
Log.i(TAG, "run-write SPS/PPS to file");
} catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
} while (bIfRecInProcess && (!bIfNativeORRemote))
{
try
{
Log.i(TAG, "**while...");
int h264length = dataInputStream.readInt();
Log.i(TAG, "h264length:"+h264length);
tmp=0; offSet = 0; beLeft = 0; h264FileOutputStream.write(h264head);
while (offSet < h264length)
{
beLeft = h264length - offSet;
tmp = dataInputStream.read(h264frame, 0, READ_SIZE < beLeft ? READ_SIZE : beLeft);
Log.i(TAG, String.format("H264 %d,%d,%d", h264length, offSet, tmp));
offSet += tmp;
h264FileOutputStream.write(h264frame, 0, tmp);
} } catch (Exception e)
{
// TODO: handle exception
e.printStackTrace();
}
}
//
}

4 Ref/Related
1 http://blog.csdn.net/zblue78/article/details/6078040
2 http://blog.csdn.net/zblue78/article/details/6083374
3 http://www.docin.com/p-282454756.html
4 http://blog.csdn.net/qwertyuj/article/details/7029836
5 http://www.cnblogs.com/skyseraph/archive/2012/03/31/2427593.html
6 http://www.cnblogs.com/skyseraph/archive/2012/03/23/2415018.html
7 http://www.cnblogs.com/skyseraph/archive/2012/04/01/2429384.html
【流媒体】 Android 实时视频编码—H.264硬编码的更多相关文章
- Android 实时视频编码—H.264硬编码
from://http://www.cnblogs.com/skyseraph/archive/2012/04/04/2431771.html 1 硬编码 & 软编码 硬编码:通过调用And ...
- 使用VideoToolbox硬编码H.264<转>
文/落影loyinglin(简书作者)原文链接:http://www.jianshu.com/p/37784e363b8a著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. ======= ...
- 转:MediaCoder H.264格式编码参数设置及详解
转: http://mediacoder.com.cn/node/81 由于现在大部分视频转码都选择H.264格式进行编码,同时CUDA编码的画质还达不到x264软编码的质量(如果你对画质无要求,可以 ...
- 01:***VideoToolbox硬编码H.264
最近接触了一些视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会提供GPU ...
- 【图像处理】DVR H.264视频编码基本知识
视频编码技术基本是由ISO/IEC制定的MPEG-x和ITU-T制定的H.26x两大系列视频编码国际标准的推出.从H.261视频编码建议,到 H.262/3.MPEG-1/2/4等都有一个共同的不断追 ...
- 视频基础知识:浅谈视频会议中H.264编码标准的技术发展
浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...
- MPEG-4与H.264的区别 , 编码 以及 应用
MPEG4是适用于监控领域的压缩技术 MPEG4于1998年11月公布,原预计1999 年1月投入使用的国际标准MPEG4不仅是针对一定比特率下的视频.音频编码,更加注重多媒体系统的交互性和灵活性.M ...
- 最简单的基于FFMPEG的视频编码器(YUV编码为H.264)
本文介绍一个最简单的基于FFMPEG的视频编码器.该编码器实现了YUV420P的像素数据编码为H.264的压缩编码数据.编码器代码十分简单,可是每一行代码都非常重要,适合好好研究一下.弄清楚了本代码也 ...
- 新手学习FFmpeg - 调用API完成录屏并进行H.264编码
Screen Record H.264 目前在网络传输视频/音频流都一般会采用H.264进行编码,所以尝试调用FFMPEG API完成Mac录屏功能,同时编码为H.264格式. 在上一篇文章中,通过调 ...
随机推荐
- WebSphere数据源配置
WebSphere data source Configuration login http://localhost:9061/ibm/console/login.do(According to yo ...
- NYOJ-214 单调递增子序列(二) TLE 分类: NYOJ 2014-01-28 22:57 171人阅读 评论(0) 收藏
#include<stdio.h> #include<stdlib.h> #define max(x,y) x>y?x:y #define MAXX 100005 int ...
- Linux 搭建SVN 服务器(转)
一. SVN 简介 Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据. 这些数据放置在一个中央资料档案库 (repository) 中 ...
- TJU 4087. box
题目:Tuhao and his two small partners participated in the tournament.But in the end, they lost the cha ...
- EditorWindow edit ScriptableObject
using UnityEngine; [System.Serializable] public class Weapon { //[SerializeField] public string weap ...
- linux gcc++漏洞:普通用户获得root权限
linux gcc++漏洞:普通用户获得root权限 2012-02-06 10:22:38| 分类: linux安全|举报|字号 订阅 经我测试在RHEL5 / CentOS5 / F ...
- 开源搜索引擎Solr的快速搭建及集成到企业门户最佳实施方案--转载
笔者经过研究查阅solr官方相关资料经过两周的研究实现了毫秒级百万数据的搜索引擎的搭建并引入到企业门户.现将实施心得和步骤分享一下. 1. jdk1.6 安装jdk1.6到系统默认目录下X: ...
- MJRefresh插件引起的错误
添加的头部或者尾部刷新,离开这个界面的时候需要移除 - (void)dealloc { [_tableView removeHeader];} 不同版本的处理的方式不同 报的错误: 类的一个实例 ...
- Python 融于ASP框架
一.ASP的平反 想到ASP 很多人会说 “asp语言很蛋疼,不能面向对象,功能单一,很多东西实现不了” 等等诸如此类. 以上说法都是错误的,其一ASp不是一种语言是 微软用来代替CGI的一种web框 ...
- VS2010 常用快捷键
VS2010版快捷键 Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL ...