iOS 使用libx264编码视频

x265编码H265 随着高清视频的发展,4k、8K分辨率的视频越来越多,但是4k、8k等超大分辨数据也是非常大,所以就需要一个压缩效率更高的视频压缩编码器,于是2013年推出了新一代压缩编码标准H265(HEVC)。 阅读详情

首先视频采集使用AVCaptureSession,输出参数设置如下

 AVCaptureVideoDataOutput *newVideoOutput = [[AVCaptureVideoDataOutput alloc] init];

    [newVideoOutput setAlwaysDiscardsLateVideoFrames:YES];

    NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:

                              [NSNumber numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange],

//                              [NSNumber numberWithInt:kCVPixelFormatType_32BGRA],

                              kCVPixelBufferPixelFormatTypeKey,

                              nil];


在代理里面取得视频的buffer,先把x264编译,我参照了http://blog.youkuaiyun.com/ixfly/article/details/7621258。

首先到http://www.videolan.org/developers/x264.html下载x264的库,然后解压,我解压出是x264-snapshot-20130604-2245文件夹

打开shell,进入x264的目录,执行如下语句

CC=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc ./configure --host=arm-apple-darwin --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk --prefix='dist' --extra-cflags='-arch armv7s' --extra-ldflags='-arch armv7s -L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/lib/system' --enable-pic

然后make&&make install,libx264.a就出来啦。

将libx264.a添加到工程

将x264目录手动拷贝到工程下面,方便以后跟着工程走



在xcode下面BuildSetting里面设置Header Search Paths,一相对路径的形式指向你刚才拷贝的目录


好啦,现在可以使用x264了

要包含下面三个.h文件

#include "x264.h"

#include "common/common.h"

#include "encoder/set.h"

我写了个x264管理的类

代码如下

头文件

#import <Foundation/Foundation.h>

#import <CoreMedia/CoreMedia.h>

#include "x264.h"

#include "common/common.h"

#include "encoder/set.h"


@interface x264Manager : NSObject{

    x264_param_t * p264Param;

    x264_picture_t * p264Pic;

    x264_t *p264Handle;

    x264_nal_t  *p264Nal;

    int previous_nal_size;

    unsigned  char * pNal;

    FILE *fp;

    unsigned char szBodyBuffer[1024*32];

}


- (void)initForX264; //初始化x264

- (void)initForFilePath; //初始化编码后文件的保存路径

- (void)encoderToH264:(CMSampleBufferRef )pixelBuffer; //将CMSampleBufferRef格式的数据编码成h264并写入文件

@end


//

//  x264Manager.m

//  IOSCamDemo

//

//  Created by huangyuling on 6/5/13.

//  Copyright (c) 2013 hyl. All rights reserved.

//


#import "x264Manager.h"


@implementation x264Manager


- (void)initForX264{

 

        p264Param = malloc(sizeof(x264_param_t));

        p264Pic  = malloc(sizeof(x264_picture_t));

        memset(p264Pic,0,sizeof(x264_picture_t));

        //x264_param_default(p264Param);  //set default param

        x264_param_default_preset(p264Param, "veryfast", "zerolatency");

        p264Param->i_threads = 1;

        p264Param->i_width   = 352;  //set frame width

        p264Param->i_height  = 288;  //set frame height

        p264Param->b_cabac =0;

        p264Param->i_bframe =0;

        p264Param->b_interlaced=0;

        p264Param->rc.i_rc_method=X264_RC_ABR;//X264_RC_CQP

        p264Param->i_level_idc=21;

        p264Param->rc.i_bitrate=128;

        p264Param->b_intra_refresh = 1;

        p264Param->b_annexb = 1;

        p264Param->i_keyint_max=25;

        p264Param->i_fps_num=15;

        p264Param->i_fps_den=1;

        p264Param->b_annexb = 1;

        //    p264Param->i_csp = X264_CSP_I420;

        x264_param_apply_profile(p264Param, "baseline");

        if((p264Handle = x264_encoder_open(p264Param)) == NULL)

        {

            fprintf( stderr, "x264_encoder_open failed/n" );

            return ;

        }

        x264_picture_alloc(p264Pic, X264_CSP_I420, p264Param->i_width, p264Param->i_height);

        p264Pic->i_type = X264_TYPE_AUTO;


  

}


- (void)initForFilePath{

    char *path = [self GetFilePathByfileName:"IOSCamDemo.h264"];

    NSLog(@"%s",path);

    fp = fopen(path,"wb");

}


- (char*)GetFilePathByfileName:(char*)filename


{

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *strName = [NSString stringWithFormat:@"%s",filename];

    

    NSString *writablePath = [documentsDirectory stringByAppendingPathComponent:strName];

    

    int len = [writablePath length];

    

    char *filepath = (char*)malloc(sizeof(char) * (len + 1));

    

    [writablePath getCString:filepath maxLength:len + 1 encoding:[NSString defaultCStringEncoding]];

    

    return filepath;

}


- (void)encoderToH264:(CMSampleBufferRef)sampleBuffer{

    

    CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

    

    CVPixelBufferLockBaseAddress(pixelBuffer, 0);

   

    uint8_t  *baseAddress0 = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0);

    uint8_t  *baseAddress1 = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1);

    

    int         i264Nal;

    x264_picture_t pic_out;

    

    memcpy(p264Pic->img.plane[0], baseAddress0, 352*288);

    uint8_t * pDst1 = p264Pic->img.plane[1];

    uint8_t * pDst2 = p264Pic->img.plane[2];

    for( int i = 0; i < 352*288/4; i ++ )

    {

        *pDst1++ = *baseAddress1++;

        *pDst2++ = *baseAddress1++;

    }

    

    if( x264_encoder_encode( p264Handle, &p264Nal, &i264Nal, p264Pic ,&pic_out) < 0 )

    {

        fprintf( stderr, "x264_encoder_encode failed/n" );

    }

    NSLog(@"i264Nal======%d",i264Nal);

    

    if (i264Nal > 0) {

        

        int i_size;

        char * data=(char *)szBodyBuffer+100;

        for (int i=0 ; i<i264Nal; i++) {

            if (p264Handle->nal_buffer_size < p264Nal[i].i_payload*3/2+4) {

                p264Handle->nal_buffer_size = p264Nal[i].i_payload*2+4;

                x264_free( p264Handle->nal_buffer );

                p264Handle->nal_buffer = x264_malloc( p264Handle->nal_buffer_size );

            }

            i_size = p264Nal[i].i_payload;

            

            memcpy(data, p264Nal[i].p_payload, p264Nal[i].i_payload);

            fwrite(data, 1, i_size, fp);

        }

        

    }

    CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);

}


@end


注意到这里x264设置的时候也是352x288的,要与上面output里面设置的一致才好,你也选择其他宽高


然后先初始化保存路径,在哪里初始化自己选择,我的程序是

[self.manager264 initForFilePath];

在

AVCaptureVideoDataOutputSampleBufferDelegate代理的方法中我们会获得数据,在那里调用前面的方法编码,不过记得编码签要初始化x264,我实在一开始就初始化了

 x264Manager *m264 = [[x264Manager alloc]init];

        [m264 initForX264];

        self.manager264 = m264;

        [m264 release];

下面是代理的方法

#pragma - remark AVCaptureVideo(Audio)DataOutputSampleBufferDelegate method

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{

    if (captureOutput == self.captureManager.videOutput) {

        [self.manager264 encoderToH264:sampleBuffer];

    }

}

感觉差不多结束了,以后发现漏了啥再补充吧
使用libx265对YUV进行h265编码 阅读详情

相关推荐

iOS FFmpeg实时YUV420P编码H264

关于iOS环境下对YUV420P编码H264

Dean的博客 4109

x265

#include #include #include #include #pragma comment(lib,"libx265.lib") int main(){ FILE*f_src=NULL; FILE*f_des=NULL; const char*filename_src="akiyo.yuv"; const char*filename_des="akiyo.265"; int widt

ww506772362的专栏 1540

【x265编码器】章节2——x265编码流程及基于x265的编码器demo

hevc、h265、x265、编码器、x265API、基于x265的编码器、x265编码流程、x265demo、x265代码解析、x265流程解析

vcvdv123的博客 4万+

HEVC(H.265) encode

HEVC(H.265) encode demo: https://github.com/wangzuxing/MyFFmpegH264H265YUVOpenGL 编码库: X265 --- 编码符合高效率视频编码(HEVC/H.265)标准的视频的开源库 H.265/HEVC和H.264/AVC的编码架构相似: 帧内预测(intra prediction)、 帧间预测(inter prediction)、 转换

keen_zuxwang的博客 1698

FFmpeg集成H.264编码实战详解

H.264作为当前最主流的视频压缩标准之一,凭借其高压缩效率、良好的图像质量以及广泛的设备兼容性,在直播、点播、视频会议和移动视频应用中占据核心地位。FFmpeg作为一个功能强大的多媒体处理框架,提供了对H.264编码的完整支持,底层常通过集成x264开源库实现高效编码。graph TDA[原始YUV视频帧] --> B(FFmpeg libavcodec)B --> C{x264编码器}C --> D[帧间预测]C --> E[变换量化]C --> F[熵编码]

weixin_42594419的博客 896

初识数据结构之入门必懂——线性表(顺序表)

本文将介绍数据结构中的线性表与线性表中最简单的结构——顺序表

m0_64705485的博客 904

iOS FFmpeg+libx264包的产生

在FFmpeg使用到编码时要使用到libx264,通过FFmpeg+libx264可实现视频编码效果。

irainsa的博客 207

UG/NX二次开发实战:用Python脚本批量更新100个零件参数,解放你的双手

本文详细介绍了如何利用NXOpen Python API进行UG/NX二次开发,实现批量更新100个零件参数的自动化流程。通过环境配置、框架设计、核心代码实现及性能优化,帮助工程师高效完成参数化设计任务,显著提升工作效率。

weixin_28694169的博客 276

1小时学会:最简单的iOS直播推流(八)h264/aac 软编码

最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),美颜,flv编码,rtmp协议,陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!! 源代码:https://github.com/hardman/AWLive 软编码包含3部分内容: 1. 将pcm/yuv数据编码成aac/h264格式 2. 将aac/h264数据封装成f

hard_man的专栏 1889

STM32 FATFS文件系统按行读取SD卡数据

STM32 SD数据实现按行读取

qq_32216815的博客 7824

FANUC机器人S523 新款PN板卡与西门子PLC通信配置介绍

FANUC机器人S523 新款PN板卡与西门子PLC通信配置介绍

Robot_PLC_HMI_Automation 351

1小时学会:最简单的iOS直播推流(八)h264 aac 软编码

最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),美颜,flv编码,rtmp协议,陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!! 源代码:https://github.com/hardman/AWLive 软编码包含3部分内容: 将pcm/yuv数据编码成aac/h264格式 将aac/h264数据封装成flv格式 另外...

weixin_34240520的博客 259

PX4从放弃到精通(二十二):日志

文章目录前言一、下载日志二、ulog转CSV三、利用flightplot软件分析PX4的ulog日志1 windos安装2 ubuntu18.04安装四、使用PlotJuggler分析PX4日志五、设置日志记录条件六、添加自定义日志消息 前言 PX4 1.10以上固件 QGC 一、下载日志 将飞控链接地面站,在下图页面点击“刷新”,即可看到保存的日志(前提是要有TF卡) 选择需要下载的日志,点击右侧的“下载”,然后选择目录即可进行下载,如果想擦除所有的日志,可以点击右侧的“擦除全部” 二、ulog转CS

超维空间科技的博客 6792

ffmpeg的那点小事儿--编译ffmpeg同时支持libx264(视频编码)和libfdk(音频编码)

ffmpeg的那点小事儿--编译ffmpeg同时支持libx264(视频编码)和libfdk(音频编码) 主要是shell脚本编写上的问题,直接上脚本代码 #!/bin/bash #1、首先:定义下载的库名称 source="ffmpeg-4.0.2" #2、其次:定义".h/.m/.c"文件编译的结果目录 #目录作用:用于保存.h/.m/.c文件编译后的结果.o文件 cache="ca...

Avalanching博客 8228

【技能】OpenClaw Skills学习及手搓一个极简skill

本文介绍了OpenClaw Skills的基础概念与使用方法。Skills是OpenClaw代理使用工具的核心载体,通过SKILL.md文件定义技能属性和执行方式。技能加载遵循"工作区>本地>内置>自定义目录"的优先级规则。用户可通过ClawHub一键安装现成技能,也可自定义开发技能:创建技能目录,编写包含YAML元数据和执行指令的SKILL.md文件,放置于工作区skills目录进行测试。文章还介绍了多代理场景下的技能共享、插件集成以及安全注意事项,包括沙箱使用和敏感

海兰 3975

openclaw-cn : 无法将“openclaw-cn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案

本文主要介绍了openclaw-cn : 无法将“openclaw-cn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案,希望能对使用openclaw-cn的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 10万+

ERROR: libx264 not found

ERROR: libx264 not found

ios 755

麒麟V10安装图形化界面

在配置VNC时发现,原本麒麟V10系统最小化安装,导致无图形化界面,先需要对其进行安装。 首先确保无图形化界面,可以在终端输入startX命令查看是否报错。 安装介绍: 1、 安装图形化界面 yum grouplist //查看可用yum安装组 注:这里一般会有缺少包或者出现包不符合的问题 导入软件包分组信息文件xxxx-comps.xml arm: 将此文件传送到源服务器, 然后createrepo -g导入到arm的base目录和updates目录 createrepo -g e33dc

Pro_jhf的博客 8071

一个可视频语音的软件原型

一个可视频语音的软件原型,可能还有些问题。 网络部分自定义的私有协议,为了保证实时性,对于包序列错乱和丢包的帧一律丢掉,这部分可以优化,在实时性和包的完整性做一个权衡。 编解码部分采用的是ffmpeg解码,和libx264编码,编码的cpu占用率比较高,640*480的分辨率,场景比较固定,cpu占用率一直在20%左右。为了降低cpu负荷今后可以使用酷睿3代以后的GPU编码。 打

hunauking的专栏 777

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

HTTP Live Streaming直播(iOS直播)技术分析与实现

   不经意间发现,大半年没写博客了,自觉汗颜。实则2012后半年(2018年注:这是我以前写的文章,不要奇怪时间了),家中的事一样接着一样发生,实在是没有时间。快过年了,总算忙里偷闲,把最近的一些技术成果,总结成了文章,与大家分享。   前些日子,也是项目需要,花了一些时间研究了HTTP Live Streaming(HLS)技术,并实现了一个HLS编码器HLSLiveEncoder,当然,...

码农,热爱健身,情商为零。个人主页:haibindev.github.io 1855

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

理解iOS开发中的BitCode功能

最近在辅导我戴维营战友们做手机音视频直播的App,调试的时候手机采集音视频,视频用h264编码,音频采用aac编码,通过RTMP协议往斗鱼直播频道发布媒体流,项目需要用FFMPEG和libx264两个开源项目,在编译为iOS框架库提供给学生用的时候,他们遇到了bitcode的问题,虽然可以采取直接关闭bitcode来避免错误,但是战友的求知欲必须满足,格物致知,必须让其知其究竟. libx264...

sinat_29985771的博客 564

HTTP Live Streaming直播(iOS直播)技术分析与实现

HTTP Live Streaming直播(iOS直播)技术分析与实现   不经意间发现,大半年没写博客了,自觉汗颜。实则2012后半年,家中的事一样接着一样发生,实在是没有时间。快过年了,总算忙里

wangchaoqi1985的博客 1846
上一篇: 图文并茂 在ML OS X 10.8 + XCode4.4/4.4.1下实现无证书真机调试IOS5.1.1(亲测,附调试截图)
下一篇: iOS应用崩溃日志揭秘
我是一只懒虫
博客等级 码龄17年 147粉丝 25原创
评论 25
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值