【流媒體】 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

http://blog.csdn.net/zblue78/article/details/6078040

http://blog.csdn.net/zblue78/article/details/6083374

http://www.docin.com/p-282454756.html

http://blog.csdn.net/qwertyuj/article/details/7029836

http://www.cnblogs.com/skyseraph/archive/2012/03/31/2427593.html

http://www.cnblogs.com/skyseraph/archive/2012/03/23/2415018.html

http://www.cnblogs.com/skyseraph/archive/2012/04/01/2429384.html

【流媒体】 Android 实时视频编码—H.264硬编码的更多相关文章

  1. Android 实时视频编码—H.264硬编码

    from://http://www.cnblogs.com/skyseraph/archive/2012/04/04/2431771.html 1  硬编码 & 软编码 硬编码:通过调用And ...

  2. 使用VideoToolbox硬编码H.264<转>

    文/落影loyinglin(简书作者)原文链接:http://www.jianshu.com/p/37784e363b8a著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. ======= ...

  3. 转:MediaCoder H.264格式编码参数设置及详解

    转: http://mediacoder.com.cn/node/81 由于现在大部分视频转码都选择H.264格式进行编码,同时CUDA编码的画质还达不到x264软编码的质量(如果你对画质无要求,可以 ...

  4. 01:***VideoToolbox硬编码H.264

    最近接触了一些视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会提供GPU ...

  5. 【图像处理】DVR H.264视频编码基本知识

    视频编码技术基本是由ISO/IEC制定的MPEG-x和ITU-T制定的H.26x两大系列视频编码国际标准的推出.从H.261视频编码建议,到 H.262/3.MPEG-1/2/4等都有一个共同的不断追 ...

  6. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展

    浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...

  7. MPEG-4与H.264的区别 , 编码 以及 应用

    MPEG4是适用于监控领域的压缩技术 MPEG4于1998年11月公布,原预计1999 年1月投入使用的国际标准MPEG4不仅是针对一定比特率下的视频.音频编码,更加注重多媒体系统的交互性和灵活性.M ...

  8. 最简单的基于FFMPEG的视频编码器(YUV编码为H.264)

    本文介绍一个最简单的基于FFMPEG的视频编码器.该编码器实现了YUV420P的像素数据编码为H.264的压缩编码数据.编码器代码十分简单,可是每一行代码都非常重要,适合好好研究一下.弄清楚了本代码也 ...

  9. 新手学习FFmpeg - 调用API完成录屏并进行H.264编码

    Screen Record H.264 目前在网络传输视频/音频流都一般会采用H.264进行编码,所以尝试调用FFMPEG API完成Mac录屏功能,同时编码为H.264格式. 在上一篇文章中,通过调 ...

随机推荐

  1. preseed.cfg分区设定案例

    很久之前做ubuntu的PXE配置ubuntu的preseed费了很大的力气,总结的不多,现在温习一下. 就我所接触的,有分区普通磁盘,LVM,和raid三种方式.其中前两中方式比较多,raid方式是 ...

  2. rtsp实时流通过rtmp推送到服务端

    很多朋友都会问到rtsp如何通过rtmp协议推送到服务端,正好前段时间开发了这个功能写在这里,和大家分享下. 首先我想说的是:ffmpeg可以实现这个功能.ffmpeg支持rtsp协议,也支持rtmp ...

  3. Portion of class Throwable’s inheritance hierarchy

  4. php sso单点登录原理阐述

    原理:就是用户登录了单点登录系统(sso)之后,就可以免登录形式进入相关系统: 实现: 点击登录跳转到SSO登录页面并带上当前应用的callback地址 登录成功后生成COOKIE并将COOKIE传给 ...

  5. Spring MVC学习问题记录

    自2015年3月11日开始进行记录 day01 2015.03.11 问题1:Line 1 in XML document from URL is invalid; 今天出现了Content is n ...

  6. 亚马逊 在线测试题目 amazon

    分析:其实就是求矩形中某一个点到其他点的距离加权最小 方法一: 对每一个点求其到其他点的加权距离,然后比较最小.由于有M*N个点,对每一个点求加权距离是O(M*N)的,所以整体时间复杂度是O(M*M* ...

  7. CSL概述(翻译总结自TI官方文档)

    一.简单介绍 CSL是函数,宏和符号常数的集合,用来控制和配置片上外设.(Chip Support Library) 每一个外设都有自己对应的CSL模块.每个模块有自己的支持符,来表示对于给定的设备, ...

  8. YTKNetwork

    YTKNetwork 是猿题库 iOS 研发团队基于 AFNetworking 封装的 iOS 网络库,其实现了一套 High Level 的 API,提供了更高层次的网络访问抽象. YTKNetwo ...

  9. 表单很多数据项录入的时候,提交controller发生异常,数据回显。

    1.添加的情况(Model传递Form Data) request.getSession().setAttribute("car", car); //抛出异常的时候,数据回显. 2 ...

  10. 数据库链接 mysql,sqlserver

    1.生成对象工厂 /// <summary> /// 生成对象工厂 /// </summary> public class DBFactory { /// <summar ...