【流媒体】 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格式. 在上一篇文章中,通过调 ...
随机推荐
- 向Array中添加归并排序
归并排序思路 1) 归并 从两个有序表R[low...mid]和R[mid+1...high],每次从左边依次取出一个数进行比较,将较小者放入tmp数组中,最后将两段中剩下的部分直接复制到tmp中. ...
- jquery动态加载JS【方法getScript】的改进
http://www.cnblogs.com/cuitsl/archive/2012/11/15/2771549.html
- android开发 图片合成
private static Bitmap compositeImages(Bitmap srcBitmap,Bitmap dstBitmap){ Bitmap bmp = null; //下面这个B ...
- gmail邮箱怎么批量删除邮件
转载:http://jingyan.baidu.com/article/9f7e7ec056cbcd6f2815543c.html 首先打开gmail邮箱,随便打开一封邮件,找到发件人邮件地址,复制, ...
- IOS常用加密GTMBase64
GTMDefines.h // // GTMDefines.h // // Copyright 2008 Google Inc. // // Licensed under the Apache Lic ...
- poj 1986 Distance Queries LCA
题目链接:http://poj.org/problem?id=1986 Farmer John's cows refused to run in his marathon since he chose ...
- NYOJ-58 最小步数 AC 分类: NYOJ 2014-01-22 22:01 217人阅读 评论(0) 收藏
#include<stdio.h> void dfs(int step,int x,int y); int d[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; i ...
- HDOJ 3486 Interviewe
人生中第一次写RMQ....一看就知道 RMQ+2分但是题目文不对题....不知道到底在问什么东西....各种WA,TLE,,RE...后就过了果然无论错成什么样都可以过的,就是 上层的样例 啊 I ...
- Apache CXF实现Web Service(4)——Tomcat容器和Spring实现JAX-RS(RESTful) web service
准备 我们仍然使用 Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 中的代码作为基础,并 ...
- codeforces 425A Sereja and Swaps(模拟,vector,枚举区间)
题目 这要学习的是如何枚举区间,vector的基本使用(存入,取出,排序等),这题的思路来自: http://www.tuicool.com/articles/fAveE3 //vector 可以用s ...