xml地图|网站地图|网站标签 [设为首页] [加入收藏]

iOS软编码实现,FFmpeg框架在iOS平台上的编译和使

来源:http://www.ccidsi.com 作者:呼叫中心培训课程 人气:81 发布时间:2020-04-28
摘要:4.3.2 输入 ./ffmpeg-build.sh 专一:这里编译可以编写翻译各类格式的有 arm64 armv7 x86_64 i386 格式 假使编写翻译真机版 ./ffmpeg-build.sh arm64 比如编写翻译模拟器版 ./ffmpeg-build.sh x86_64 i386 编译f
4.3.2 输入 ./ffmpeg-build.sh

专一:这里编译可以编写翻译各类格式的有arm64 armv7 x86_64 i386格式

假使编写翻译真机版

./ffmpeg-build.sh arm64

比如编写翻译模拟器版

./ffmpeg-build.sh x86_64 i386

图片 1编译ffmpeg

编写翻译成功如图

图片 2编写翻译成功图片 3结果

编译FFmpeg(iOS)

  • 下载编译FFmpeg所要求的本子文件瓦斯-preprocessor.pl
    • 下载地址: https://github.com/mansr/gas-preprocessor
    • 复制瓦斯-preprocessor.pl到/usr/sbin下,(这一个相应是复制到/usr/local/bin)
    • 改进文件权限:chmod 777 /usr/local/bin/瓦斯-preprocessor.pl
  • 下载脚本FFmpeg脚本
    • 地址: https://github.com/kewlbear/FFmpeg-iOS-build-script
    • 解压,找到文件 build-ffmpeg.sh
    • 试行性格很顽强在山高水险或巨大压力面前不屈本文件:./build-ffmpeg.sh

运营开采工程不会报错了那般FFmpeg尽管导入成功了

4、编译

开采终端

编译X264

  • 下载x264
    • x264官方网址 下载x264源码,将其文件夹名称改为x264
    • http://www.videolan.org/developers/x264.html
  • 下载gas-preprocessor(FFmpeg编写翻译时一度下载过卡塔尔国
  • 下载x264 build shell
    • 下载build-x264.sh 将文件build-x264.sh放在x264同一流目录里面,注意不是放在x264文本夹里面。
    • https://github.com/kewlbear/x264-ios
  • 修正权限/实践脚本
    • sudo chmod u x build-x264.sh
    • sudo ./build-x264.sh

cd 将文件拖进来回车

2、下载并安顿瓦斯-preprocessor

gas-preprocessor

瓦斯-preprocessor是大家必要编写翻译的ffmpeg的所急需的台本文件。

1)我们将其解压后,发掘中间唯有简要的 4 个文本,如下图:

图片 41476596-8e51f6dc2fad2847.png

2)将瓦斯-preprocessor.pl文件复制粘贴到 /usr/sbin/ 目录下(按commd G飞速键,复制此路线State of Qatar,借使根本就不能够将那些文件复制到这些门路,大家须要换贰个门道,/usr/local/bin/ 目录下,然后为文件开启可进行权限,展开终端输入以下命令行。

  • 如果,报错

    图片 51476596-80c78ca1367140ed.jpg

chmod 777 /usr/sbin/gas-preprocessor.pl或者chmod 777 /usr/local/bin/gas-preprocessor.pl

图片 61476596-88d9cc1358929aea.jpg

假使依旧十一分,能够明确是权力难题,,那么施行以前增进

cp -R /Users/mical_lf/Desktop/gas-preprocessor.pl /usr/local/bin

iOS项目中集成FFmpeg

  • 将编译好的文件夹拖入到工程中
  • 增加注重库: libiconv.dylib/libz.dylib/libbz2.dylib/CoreMedia.framework/AVFoundation.framework
  • FFmpeg编码五个根本的类
  • AVFormat
    • 保存的是解码后和原有的音录像新闻
  • AVPacket
    • 解码完毕的多寡及附加音讯(解码时间戳、展现时间戳、时间长度等)
/*
 *  设置X264
 */
- (int)setX264ResourceWithVideoWidth:(int)width height:(int)height bitrate:(int)bitrate
{
    // 1.默认从第0帧开始(记录当前的帧数)
    framecnt = 0;

    // 2.记录传入的宽度&高度
    encoder_h264_frame_width = width;
    encoder_h264_frame_height = height;

    // 3.注册FFmpeg所有编解码器(无论编码还是解码都需要该步骤)
    av_register_all();

    // 4.初始化AVFormatContext: 用作之后写入视频帧并编码成 h264,贯穿整个工程当中(释放资源时需要销毁)
    pFormatCtx = avformat_alloc_context();

    // 5.设置输出文件的路径
    fmt = av_guess_format(NULL, out_file, NULL);
    pFormatCtx->oformat = fmt;

    // 6.打开文件的缓冲区输入输出,flags 标识为  AVIO_FLAG_READ_WRITE ,可读写
    if (avio_open(&pFormatCtx->pb, out_file, AVIO_FLAG_READ_WRITE) < 0){
        printf("Failed to open output file! n");
        return -1;
    }

    // 7.创建新的输出流, 用于写入文件
    video_st = avformat_new_stream(pFormatCtx, 0);

    // 8.设置 20 帧每秒 ,也就是 fps 为 20
    video_st->time_base.num = 1;
    video_st->time_base.den = 25;

    if (video_st==NULL){
        return -1;
    }

    // 9.pCodecCtx 用户存储编码所需的参数格式等等
    // 9.1.从媒体流中获取到编码结构体,他们是一一对应的关系,一个 AVStream 对应一个  AVCodecContext
    pCodecCtx = video_st->codec;

    // 9.2.设置编码器的编码格式(是一个id),每一个编码器都对应着自己的 id,例如 h264 的编码 id 就是 AV_CODEC_ID_H264
    pCodecCtx->codec_id = fmt->video_codec;

    // 9.3.设置编码类型为 视频编码
    pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO;

    // 9.4.设置像素格式为 yuv 格式
    pCodecCtx->pix_fmt = PIX_FMT_YUV420P;

    // 9.5.设置视频的宽高
    pCodecCtx->width = encoder_h264_frame_width;
    pCodecCtx->height = encoder_h264_frame_height;

    // 9.6.设置帧率
    pCodecCtx->time_base.num = 1;
    pCodecCtx->time_base.den = 15;

    // 9.7.设置码率(比特率)
    pCodecCtx->bit_rate = bitrate;

    // 9.8.视频质量度量标准(常见qmin=10, qmax=51)
    pCodecCtx->qmin = 10;
    pCodecCtx->qmax = 51;

    // 9.9.设置图像组层的大小(GOP-->两个I帧之间的间隔)
    pCodecCtx->gop_size = 250;

    // 9.10.设置 B 帧最大的数量,B帧为视频图片空间的前后预测帧, B 帧相对于 I、P 帧来说,压缩率比较大,也就是说相同码率的情况下,
    // 越多 B 帧的视频,越清晰,现在很多打视频网站的高清视频,就是采用多编码 B 帧去提高清晰度,
    // 但同时对于编解码的复杂度比较高,比较消耗性能与时间
    pCodecCtx->max_b_frames = 5;

    // 10.可选设置
    AVDictionary *param = 0;
    // H.264
    if(pCodecCtx->codec_id == AV_CODEC_ID_H264) {
        // 通过--preset的参数调节编码速度和质量的平衡。
        av_dict_set(&param, "preset", "slow", 0);

        // 通过--tune的参数值指定片子的类型,是和视觉优化的参数,或有特别的情况。
        // zerolatency: 零延迟,用在需要非常低的延迟的情况下,比如视频直播的编码
        av_dict_set(&param, "tune", "zerolatency", 0);
    }

    // 11.输出打印信息,内部是通过printf函数输出(不需要输出可以注释掉该局)
    av_dump_format(pFormatCtx, 0, out_file, 1);

    // 12.通过 codec_id 找到对应的编码器
    pCodec = avcodec_find_encoder(pCodecCtx->codec_id);
    if (!pCodec) {
        printf("Can not find encoder! n");
        return -1;
    }

    // 13.打开编码器,并设置参数 param
    if (avcodec_open2(pCodecCtx, pCodec,&param) < 0) {
        printf("Failed to open encoder! n");
        return -1;
    }

    // 13.初始化原始数据对象: AVFrame
    pFrame = av_frame_alloc();

    // 14.通过像素格式(这里为 YUV)获取图片的真实大小,例如将 480 * 720 转换成 int 类型
    avpicture_fill((AVPicture *)pFrame, picture_buf, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height);

    // 15.h264 封装格式的文件头部,基本上每种编码都有着自己的格式的头部,想看具体实现的同学可以看看 h264 的具体实现
    avformat_write_header(pFormatCtx, NULL);

    // 16.创建编码后的数据 AVPacket 结构体来存储 AVFrame 编码后生成的数据
    av_new_packet(&pkt, picture_size);

    // 17.设置 yuv 数据中 y 图的宽高
    y_size = pCodecCtx->width * pCodecCtx->height;

    return 0;
}
  • 编码每一帧数据
/*
 * 将CMSampleBufferRef格式的数据编码成h264并写入文件
 *
 */
- (void)encoderToH264:(CMSampleBufferRef)sampleBuffer
{
    // 1.通过CMSampleBufferRef对象获取CVPixelBufferRef对象
    CVPixelBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

    // 2.锁定imageBuffer内存地址开始进行编码
    if (CVPixelBufferLockBaseAddress(imageBuffer, 0) == kCVReturnSuccess) {
        // 3.从CVPixelBufferRef读取YUV的值
        // NV12和NV21属于YUV格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane
        // 3.1.获取Y分量的地址
        UInt8 *bufferPtr = (UInt8 *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer,0);
        // 3.2.获取UV分量的地址
        UInt8 *bufferPtr1 = (UInt8 *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer,1);

        // 3.3.根据像素获取图片的真实宽度&高度
        size_t width = CVPixelBufferGetWidth(imageBuffer);
        size_t height = CVPixelBufferGetHeight(imageBuffer);
        // 获取Y分量长度
        size_t bytesrow0 = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer,0);
        size_t bytesrow1  = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer,1);
        UInt8 *yuv420_data = (UInt8 *)malloc(width * height *3/2);

        /* convert NV12 data to YUV420*/
        // 3.4.将NV12数据转成YUV420数据
        UInt8 *pY = bufferPtr ;
        UInt8 *pUV = bufferPtr1;
        UInt8 *pU = yuv420_data   width*height;
        UInt8 *pV = pU   width*height/4;
        for(int i =0;i<height;i  )
        {
            memcpy(yuv420_data i*width,pY i*bytesrow0,width);
        }
        for(int j = 0;j<height/2;j  )
        {
            for(int i =0;i<width/2;i  )
            {
                *(pU  ) = pUV[i<<1];
                *(pV  ) = pUV[(i<<1)   1];
            }
            pUV =bytesrow1;
        }

        // 3.5.分别读取YUV的数据
        picture_buf = yuv420_data;
        pFrame->data[0] = picture_buf;              // Y
        pFrame->data[1] = picture_buf  y_size;      // U
        pFrame->data[2] = picture_buf  y_size*5/4;  // V

        // 4.设置当前帧
        pFrame->pts = framecnt;
        int got_picture = 0;

        // 4.设置宽度高度以及YUV各式
        pFrame->width = encoder_h264_frame_width;
        pFrame->height = encoder_h264_frame_height;
        pFrame->format = PIX_FMT_YUV420P;

        // 5.对编码前的原始数据(AVFormat)利用编码器进行编码,将 pFrame 编码后的数据传入pkt 中
        int ret = avcodec_encode_video2(pCodecCtx, &pkt, pFrame, &got_picture);
        if(ret < 0) {
            printf("Failed to encode! n");

        }

        // 6.编码成功后写入 AVPacket 到 输入输出数据操作着 pFormatCtx 中,当然,记得释放内存
        if (got_picture==1) {
            framecnt  ;
            pkt.stream_index = video_st->index;
            ret = av_write_frame(pFormatCtx, &pkt);
            av_free_packet(&pkt);
        }

        // 7.释放yuv数据
        free(yuv420_data);
    }

    CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
}
  • 放飞能源
/*
 * 释放资源
 */
- (void)freeX264Resource
{
    // 1.释放AVFormatContext
    int ret = flush_encoder(pFormatCtx,0);
    if (ret < 0) {
        printf("Flushing encoder failedn");
    }

    // 2.将还未输出的AVPacket输出出来
    av_write_trailer(pFormatCtx);

    // 3.关闭资源
    if (video_st){
        avcodec_close(video_st->codec);
        av_free(pFrame);
    }
    avio_close(pFormatCtx->pb);
    avformat_free_context(pFormatCtx);
}

int flush_encoder(AVFormatContext *fmt_ctx,unsigned int stream_index)
{
    int ret;
    int got_frame;
    AVPacket enc_pkt;
    if (!(fmt_ctx->streams[stream_index]->codec->codec->capabilities &
          CODEC_CAP_DELAY))
        return 0;

    while (1) {
        enc_pkt.data = NULL;
        enc_pkt.size = 0;
        av_init_packet(&enc_pkt);
        ret = avcodec_encode_video2 (fmt_ctx->streams[stream_index]->codec, &enc_pkt,
                                     NULL, &got_frame);
        av_frame_free(NULL);
        if (ret < 0)
            break;
        if (!got_frame){
            ret=0;
            break;
        }
        ret = av_write_frame(fmt_ctx, &enc_pkt);
        if (ret < 0)
            break;
    }
    return ret;
}

ruby-e-1

5、Xcode集成FFmpeg

1.将编写翻译的ffmpeg中的include与lib拖到工程中2.在急需用到ffmpeg的地方引进相应的头文件

//引入头文件//核心库->音视频编解码库#import <libavcodec/avcodec.h>//导入封装格式库#import <libavformat/avformat.h>

图片 7过程

3.消除报错

图片 8报错解决进程在BuildSetting中搜索Header Search Paths,增加include的引进。然后编写翻译,OK,报错化解

写在最后:希望那篇文章对你有援救。当然假使您开掘成能够优化之处,希望你能慷慨的建议来。最终祝你做事欢畅!

Mac安装/使用FFmpeg

  • 安装
    • ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"
    • brew install ffmpeg
  • 大致利用
    • 中间转播格式: ffmpeg -i story.webm story.mp3
    • 暌违摄像: ffmpeg -i story.DVD -vcodec copy -an demo.VCD
    • 抽离音频: ffmpeg -i story.DVD -acodec copy -vn demo.aac

cd 将文件拖进来回车

每当情感好或不佳的时候,笔者爱好一人赏鉴这种画面。期望什么日期能落到实处或愿意能够无约束的过这种生活。为了那么些梦,那不又在着力的工作中。方今做事中供给用到FFmpeg,就在此间总计下通过shell脚本编写翻译FFmpeg的长河与集成人中学蒙受的主题材料。

iOS录像软编码

./configure && make -j 4 && sudo make install

3、脚本编辑撰写

#!/bin/bash#库名称source="ffmpeg-3.4"#下载这个库if [ ! -r $source ]then#没有下载,那么我需要执行下载操作 echo "没有FFmpeg库,我们需要下载….."#下载:怎么下载?#"curl"命令表示:它可以通过Httpftp等等这样的网络方式下载和上传文件(它是一个强大网络工具)#基本格式:curl 地址#指定下载版本#下载完成之后,那么我们需要解压#"tar"命令:表示解压和压缩#基本语法:tar options#例如:tar xj#options选项分为很多中类型#-x 表示:解压文件选项#-j 表示:是否需要解压bz2压缩包(压缩包格式类型有很多:zip、bz2等等…) curl http://ffmpeg.org/releases/${source}.tar.bz2 | tar xj || exit 1fi

如上直接复制到ffmpeg-download.sh就可以。ffmpeg-download.sh纵然编写成功

#!/bin/bash#1、首先:定义下载的库名称#ffmpeg-3.4是我们通过ffmpeg-download.sh脚本下载的ffmpeg的文件名source="ffmpeg-3.4"#2、其次:定义".h/.m/.c"文件编译的结果目录#目录作用:用于保存.h/.m/.c文件编译后的结果.o文件cache="cache"#3、定义".a"静态库保存目录#pwd命令:表示获取当前目录staticdir=`pwd`/"my-ffmpeg-iOS"#4、添加FFmpeg配置选项->默认配置#Toolchain options:工具链选项(指定我么需要编译平台CPU架构类型,例如:arm64、x86等等…)#--enable-cross-compile: 交叉编译#Developer options:开发者选项#--disable-debug: 禁止使用调试模式#Program options选项#--disable-programs:禁用程序(不允许建立命令行程序)#Documentation options:文档选项#--disable-doc:不需要编译文档#Toolchain options:工具链选项#--enable-pic:允许建立与位置无关代码configure_flags="--enable-cross-compile --disable-debug --disable-programs --disable-doc --enable-pic"#核心库(编解码->最重要的库):avcodecconfigure_flags="$configure_flags --enable-avdevice --enable-avcodec --enable-avformat"configure_flags="$configure_flags --enable-swresample --enable-swscale --disable-postproc"configure_flags="$configure_flags --enable-avfilter --enable-avutil --enable-avresample "#5、定义默认CPU平台架构类型#arm64 armv7->真机->CPU架构类型#x86_64 i386->模拟器->CPU架构类型archs="arm64 armv7 x86_64 i386"#6、指定我们的这个库编译系统版本->iOS系统下的7.0以及以上版本使用这个静态库targetversion="7.0"#7、接受命令后输入参数#我是动态接受命令行输入CPU平台架构类型(输入参数:编译指定的CPU库)if [ "$*" ]then #存在输入参数,也就说:外部指定需要编译CPU架构类型 archs="$*"fi#8、安装汇编器->yasm#判断一下是否存在这个汇编器#目的:通过软件管理器,然后下载安装我的汇编器#一个命令就能够帮助我们完成所有的操作#错误一:`which` yasm#正确一:`which yasm`#`which yasm`->检测是否安装了yasm程序if [ ! `which yasm` ]then #Homebrew:软件管理器 #下载一个软件管理器:安装、卸载、更新、搜索等等... #错误二:`which` brew #正确二:`which brew` #`which brew`->检测是否安装了软件管理器 if [ ! `which brew` ] then echo "安装brew" ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" || exit 1 fi echo "安装yasm" #成功了 #下载安装这个汇编器 #exit 1->安装失败了,那么退出程序 brew install yasm || exit 1fiecho "循环编译"#9、for循环编译FFmpeg静态库currentdir=`pwd`for arch in $archsdo echo "开始编译" #9.1、创建目录 #在编译结果目录下-创建对应的平台架构类型 mkdir -p "$cache/$arch" #9.2、进入这个目录 cd "$cache/$arch" #9.3、配置编译CPU架构类型->指定当前编译CPU架构类型 #错误三:"--arch $arch" #正确三:"-arch $arch" archflags="-arch $arch" #9.4、判定一下你到底是编译的是模拟器.a静态库,还是真机.a静态库 if [ "$arch" = "i386" -o "$arch" = "x86_64" ] then #模拟器 platform="iPhoneSimulator" #支持最小系统版本->iOS系统 archflags="$archflags -mios-simulator-version-min=$targetversion" else #真机(mac、iOS都支持) platform="iPhoneOS" #支持最小系统版本->iOS系统 archflags="$archflags -mios-version-min=$targetversion -fembed-bitcode" #注意:优化处理 #如果架构类型是"arm64",那么 if [ "$arch" = "arm64" ] then #GNU汇编器(GNU Assembler),简称为GAS #GASPP->汇编器预处理程序 #解决问题:分段错误 #通俗一点:就是程序运行时,变量访问越界一类的问题 EXPORT="GASPP_FIX_XCODE5=1" fi fi #10、正式编译 #tr命令可以对来自标准输入的字符进行替换、压缩和删除 #'[:upper:]'->将小写转成大写 #'[:lower:]'->将大写转成小写 #将platform->转成大写或者小写 XCRUN_SDK=`echo $platform | tr '[:upper:]' '[:lower:]'` #编译器->编译平台 CC="xcrun -sdk $XCRUN_SDK clang" #架构类型->arm64 if [ "$arch" = "arm64" ] then #音视频默认一个编译命令 #preprocessor.pl帮助我们编译FFmpeg->arm64位静态库 AS="gas-preprocessor.pl -arch aarch64 -- $CC" else #默认编译平台 AS="$CC" fi echo "执行到了1" #目录找到FFmepg编译源代码目录->设置编译配置->编译FFmpeg源码 #--target-os:目标系统->darwin(mac系统早起版本名字) #darwin:是mac系统、iOS系统祖宗 #--arch:CPU平台架构类型 #--cc:指定编译器类型选项 #--as:汇编程序 #$configure_flags最初配置 #--extra-cflags #--prefix:静态库输出目录 TMPDIR=${TMPDIR/%/} $currentdir/$source/configure  --target-os=darwin  --arch=$arch  --cc="$CC"  --as="$AS"  $configure_flags  --extra-cflags="$archflags"  --extra-ldflags="$archflags"  --prefix="$staticdir/$arch"  || exit 1 echo "执行了" #解决问题->分段错误问题 #安装->导出静态库 #执行命令 #将-j设置为支持多核心/线程 make -j3 install $EXPORT || exit 1 #回到了我们的脚本文件目录 cd $currentdirdone

如上直接复制到ffmpeg-build.sh就能够。ffmpeg-build.sh就算编写成功注意事项:source="ffmpeg-3.4"中ffmpeg-3.4是大家由此ffmpeg-download.sh脚本下载的ffmpeg的公文名

软编码介绍

  • 软编码主假诺运用CPU进行编码的经过, 具体的编码日常会用FFmpeg x264
  • FFmpeg
    • FFmpeg是叁个万分强盛的音录像处理库,满含摄像访问功能、录像格式调换、录像抓图、给录像加水印等。
    • FFmpeg在Linux平台下开辟,但它同样也能够在别的操作系统情形中编写翻译运维,富含Windows、Mac OS X等。
  • X264
    • H.264是ITU拟定的摄像编码标准
    • 而x264是二个开源的H.264/MPEG-4 AVC录制编码函数库[1] ,是最佳的有损摄像编码器,里面集成了充足多优异的算法用于摄像编码.
  • 有关软编码推荐博客(雷霄骅卡塔尔国
    • http://blog.csdn.net/leixiaohua1020

2.将文件夹内的瓦斯-preprocessor.pl文件拷贝到/usr/sbin/目录下

4.1.1 cd到FFmpeg_iOS。

下一场拖入x-code正是

1、中期希图

新建三个FFmpeg_iOS的文本夹,FFmpeg_iOS文件夹里面新建三个cache的文书夹(那么些文件名写死,前边shell脚本里面会用)。新建ffmpeg-download.sh与ffmpeg-build.sh多个本子文件在FFmpeg_iOS文件夹中。最终文件如下图:

图片 9目录

1.

图片 10漫步

1.下载达成后张开终端 步入gas-preprocessor文件夹

4.1.2 输入 ./ffmpeg-download.sh
./ffmpeg-download.sh

图片 11下载FFmpeg图片 12下载达成后

若果直白编写翻译下载的ffmpeg或许会宛如下错误 报错音讯:Typedef 'AVMediaType' cannot be referenced with a enum specifier xxx....化解办法:将FFmpeg的源码中的AVMediaType改个名字之后再一次编译FFmpeg再导入工程就能够编写翻译通过。

具体方法能够在zhong duan使用linux下的sed命令,示例:

sed -i '' "s/原字符串/修正字符串/g" grep -rl 原字符串 搜索路径

本人将AVMediaType更改为FFMAVMediaType即

sed -i '' "s/AVMediaType/FFMAVMediaType/g" grep -rl AVMediaType ./ffmpeg-*

那边要留意的是Mac上的sed借使参数有-i就非得抬高备份指令,即-i后加多任意字符,那贰个字符就作为备份文件的后缀名,写''就可以。

只要报错:

sed: RE error: illegal byte sequence

缺失蒙受变量,在shell输入:

export LC_COLLATE='C'

export LC_CTYPE='C'

ruby-e

4.3.1 cd到FFmpeg_iOS。

3.急需下载相关的文本链接

首先检查Homebrew包微型机是或不是安装

Updated 1 tap (homebrew/coreState of Qatar.原因是网络不安宁不能够访谈github,还应该有正是从前作者早已设置过了Homebrew,多试一遍ruby -e "$(curl -fsSL )"

在工程中引进#import "KxMovieViewController.h"

那儿运营或然会报错 #include “libavformat/avformat.h”那一个头文件找不到

FFmpeg框架在iOS平台上的编写翻译和运用

chmod 777 /usr/sbin/gas-preprocessor.pl

4.那儿为了编写翻译时有毛病我们后天跻身下载后的yasm文件夹,通过编写翻译安装命令yasm

万一编写翻译扶植arm64结构的静态库

2.

ruby -e "$(curl -fsSL )"

在成立解码的地点

图片 13

下一场复制那一个lib的的这一条

./build-ffmpeg.sh arm64

累积上边包车型大巴依赖库

进行FFmpeg-iOS-build-script-master文件夹内的build-ffmpeg.sh

图片 14

假定1.发令若是不行就接收2.限令(小编当即用的是2.限令)

图片 15

1. 下载最新的瓦斯-preprocessor.pl,地址是https://github.com/applexiaohao/FFmpeg-iOS-build-script

寻找 library search paths 这里写图片描述

1.施用条件

图片 16

2.开辟工具

./build-ffmpeg.sh

如故编写翻译归并的版本

本文由68399皇家赌场发布于呼叫中心培训课程,转载请注明出处:iOS软编码实现,FFmpeg框架在iOS平台上的编译和使

关键词: 68399皇家赌场 BUG sh FFmpeg_iOS 直播技术分享

最火资讯