android硬编码缩放视频,【流媒体】 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实现收发

3 核心代码

① MediaRecoder视频采集

② 在initiativeVideo中setOutputFile设置以流方式输出

67d0865f17d9be527254bf8a8ff6c5b4.gif

// 设置输出文件方式: 直接本地存储 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~");

}

67d0865f17d9be527254bf8a8ff6c5b4.gif

③ startRecording

功能:通过这个函数启动线程实现视频流映射到LocalSocket,同时实现编码

private void startRecording()

{

Log.i(TAG, "##startRecording....");

new Thread(this).start();

}

run:

67d0865f17d9be527254bf8a8ff6c5b4.gif

@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();

}

}

//

}

67d0865f17d9be527254bf8a8ff6c5b4.gif

4 Ref/Related

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值