视频直播技术(二):实时视频编码之H264硬编码

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.核心代码

a). MediaRecoder视频采集

视频采集采用了MediaRecorde录制方式,详见 “【流媒體】Android 实时视频采集—MediaRecoder录制 ”

b). 在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~"); }

c). 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();
            }
        }
        //
    }
时间: 2024-10-12 16:20:16

视频直播技术(二):实时视频编码之H264硬编码的相关文章

视频直播技术-视频-编码-传输-秒开等&lt;转&gt;

转载地址:http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=2653547042&idx=1&sn=26d8728548a6b5b657079eeab121e283&scene=21#wechat_redirect 现今移动直播技术上的挑战要远远难于传统设备或电脑直播,其完整的处理环节包括但不限于:音视频采集.美颜/滤镜/特效处理.编码.封包.推流.转码.分发.解码/渲染/播放等. 视频.直播等基础知识 什么是视频?

「视频直播技术详解」系列之四:推流和传输

关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 在上一期中,我们介绍了讲解编码和封装. 本篇是<解密视频直播技术>系列之四:推流和传输.推流是直播的第一公里,直播的推流对这个直播链路影响非常大,如果推流的网络不稳定,无论我们如何做优化,观众的体验都会很糟糕.所以也是我们排查问题的第一步,如何系统地解决这类问题需要我们对相关理论有基础的认识. 本系列文章大纲如下: (一

「视频直播技术详解」系列之七:直播云 SDK 性能测试模型

?关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: (一)采集 (二)处理 (三)编码和封装 (四)推流和传输 (五)延迟优化 (六)现代播放器原理 (七)SDK 性能测试模型 本篇是<视频直播技术详解>系列的最后一篇直播云 SDK 性能测试模型,SDK 的性能对最终 App 的影响非常大.SDK 版本迭代快速,每次发布前都要进行系统的测试,测试要

视频直播技术之iOS端推流

随着网络基础建设的发展和资费的下降,在这个内容消费升级的时代,文字.图片无法满足人们对视觉的需求,因此视频直播应运而生.承载了实时性Real-Time和交互性的直播云服务是直播覆盖各行各业的新动力.网易云信推出一系列文章,对视频直播技术进行深入讲解,本篇文章将向大家介绍iOS端的推流技术. 相关阅读推荐 <视频直播:Windows中各类画面源的截取和合成方法总结> <视频直播关键技术:流畅.拥塞和延时追赶> <短视频技术详解:Android端的短视频开发技术>   直播

【流媒体】 Android 实时视频编码—H.264硬编码

[流媒體] Android 实时视频编码—H.264硬编码 SkySeraph Apr 4th 2012 Email:[email protected].com 1  硬编码 & 软编码 硬编码:通过调用Android系统自带的Camera录制视频,实际上是调用了底层的高清编码硬件模块,也即显卡,不使用CPU,速度快 软编码:使用CPU进行编码,如常见C/C++代码,一般编译生成的二进制都是的,速度相对较慢.例如使用Android NDK编译H264生成so库,编写jni接口,再使用java调用

HTML5视频直播技术

分享内容简介:目前视频直播,尤其是移动端的视频直播已经火到不行了,基本上各大互联网公司都有了自己的直播产品,所以对于直播的一些基本知识和主要技术点也要有所了解,本次分享就向大家介绍一下其中的奥秘. 内容大体框架: 怎样利用 HTML5 来播放直播视频 怎样录制直播视频 怎样实时上传直播视频 直播中的用户交互 下面是本期分享内容整理 Hello, 大家好,我是吕鸣,目前是在腾讯 SNG 的即通应用部负责手Q的兴趣部落 Web 前端开发工作. 针对目前比较火的视频直播,我做了一些研究和探索,同时我们

iOS平台基于ffmpeg的视频直播技术揭秘

现在非常流行直播,相信很多人都跟我一样十分好奇这个技术是如何实现的,正好最近在做一个ffmpeg的项目,发现这个工具很容易就可以做直播,下面来给大家分享下技术要点: 首先你得编译出ffmpeg运行所需的静态库,这个百度一下有很多内容,这里我就不多说了,建议可以用Github上的一个开源脚本来编译,简单粗暴有效率. 地址:GitHub - kewlbear/FFmpeg-iOS-build-script: Shell scripts to build FFmpeg for iOS and tvOS

原:视频直播技术中的参考技术网页

1. [置顶] [总结]视音频编解码技术零基础学习方法 http://blog.csdn.net/leixiaohua1020/article/details/18893769 2. HTTP Live Streaming直播(iOS直播)技术分析与实现 http://www.cnblogs.com/haibindev/archive/2013/01/30/2880764.html 3. 最简单的基于FFmpeg的移动端例子附件:IOS自带播放器(全部平台的示例) http://blog.csd

ios 视频流H264硬编码---分解LFLiveKit

#import "LFHardwareVideoEncoder.h" #import <VideoToolbox/VideoToolbox.h> @interface LFHardwareVideoEncoder (){ VTCompressionSessionRef compressionSession; // 编码器 NSInteger frameCount; // 帧数(用于设置关键帧) NSData *sps; NSData *pps; FILE *fp; BOOL