EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式

EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式

最近在研究EasyDarwin的Push库EasyPusher,EasyPusher可以推送H264视频到EasyDarwin服务器,终端可以通过rtsp协议访问该实时流,达到手机直播的功能,延迟基本在2秒以内。
EasyDarwinQQ群:496258327
本文主要记录一下最近研究的关于Android手机如何获取实时画面,并将数据编码为H264的格式的视频流,编码使用的是Android自带的MediaCodec,也就是硬解。
本demo的下载地址:MediaCodecDemo

MediaCodec是Android在4.1中加入的新的API,目前也有很多文章介绍MediaCodec的用法,但是很多时候很多手机都失败,主要问题出现在调用dequeueOutputBuffer的时候总是返回-1,让你以为No buffer available !这里介绍一个开源项目libstreaming,我们借助此项目中封装的一个工具类EncoderDebugger,来初始化MediaCodec会很好的解决此问题,目前为止测试了几个手机都可以成功,包括小米华为Moto。
看一下怎么使用的

EncoderDebugger debugger = EncoderDebugger.debug(getApplicationContext(), width, height);
MediaCodec mMediaCodec = MediaCodec.createByCodecName(debugger.getEncoderName());

嗯,就这样。当然了,后面还是要根据需要对mMediaCodec设置其他参数的,看一下本demo中设置参数的过程吧

private void initMediaCodec() {
    int dgree = getDgree();
    framerate = 15;
    bitrate = 2 * width * height * framerate / 20;
    EncoderDebugger debugger = EncoderDebugger.debug(getApplicationContext(), width, height);
    mConvertor = debugger.getNV21Convertor();
    try {
        mMediaCodec = MediaCodec.createByCodecName(debugger.getEncoderName());
        MediaFormat mediaFormat;
        if (dgree == 0) {
            //dree==0的时候,需要将画面旋转90度,所以这里编码的时候需要将宽和高颠倒,
            //否则编码后的会面会出现四重画面并且花屏
            mediaFormat = MediaFormat.createVideoFormat("video/avc", height, width);
        } else {
            mediaFormat = MediaFormat.createVideoFormat("video/avc", width, height);
        }
        mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
        mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, framerate);
        mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
                debugger.getEncoderColorFormat());
        mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
        mMediaCodec.configure(mediaFormat, null, 
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值