欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ffmpeg - 编译 macOS app 使用的库

程序员文章站 2022-07-01 22:23:25
...


一、使用 git 安装 ffmpeg, 编译 macOS 使用的库

1、Git 下载代码

$ git clone https://git.ffmpeg.org/ffmpeg.git

2、配置 ./configure 选项

这个要注意需要设置对macOS最低版本的要求,否则是默认当前本机的最新系统如,这样的话在使用库的时候,如果是APP要运行在10.11及之下的系统时候,就会报错。

$ ./configure --target-os=darwin --enable-static --enable-swscale --enable-nonfree  --enable-gpl --enable-version3 --enable-nonfree --disable-programs  --libdir=/ffmpegbuild/lib --incdir=/ffmpegbuild/include --enable-shared   --disable-x86asm --extra-cflags=-mmacosx-version-min=10.11 --extra-ldflags=-mmacosx-version-min=10.11


报错添加 --disable-x86asm 选项就好

$ nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.

3、执行编译和安装

$ make && sudo make install

在根目录下的 /ffmpegbuild 目录中,就是编译好的头文件和库文件,包括静态库和动态库。

iOS 也可以直接使用 homebrew 安装 ffmpeg,然后使用脚本来编译。

如脚本:https://github.com/kewlbear/FFmpeg-iOS-build-script


二、集成到项目

1、将 /ffmpegbuild 中的的两个文件,拖到工程下。

2、引入头文件

#import "avformat.h"
#import "avcodec.h"
#import "swscale.h"
#import "avutil.h"
#import "swresample.h"
#import "avdevice.h"

3、项目添加 Header Search Path

内容参考你的 Library Search Path, 将最后的 lib 地址改为 include 即可。比如我的是:

$(PROJECT_DIR)/ffmpeglib/include

否则编译可能报错: 'libavformat/avformat.h' file not found


4、测试代码

[self openInput:@"/Users/sysit/Desktop/voez.mp4"];

- (BOOL)openInput:(NSString *)path
{
    AVFormatContext * formatCtx = NULL;
    formatCtx = avformat_alloc_context();
    if (!formatCtx)  {
        NSLog(@"打开文件失败");
        return NO;
    }
    
    if (avformat_open_input(&formatCtx, [path cStringUsingEncoding:NSUTF8StringEncoding], NULL, NULL) < 0)  {
        if (formatCtx) {
            avformat_free_context(formatCtx);
        }
        NSLog(@"打开文件失败");
        return NO;
    }

    if (avformat_find_stream_info(formatCtx, NULL) < 0) {
        avformat_close_input(&formatCtx);
        NSLog(@"无法获取流信息");
        return NO;
    }
    
    NSLog(@"获取到信息");
    
    av_dump_format(formatCtx, 0, [path.lastPathComponent cStringUsingEncoding:NSUTF8StringEncoding], false);
//    self.formatCtx = formatCtx;
    return YES;
}


三、报错

1、Definition of type 'AVMediaType' conflicts with typedef of the same name

AVMediaType 和 AVFoundation.framework 里的一个定义重复,建议改为 FFAVMediaType。


2、Undefined symbols for architecture x86_64:

解决方法:引入时添加 extern "C":

extern "C" {

#import <libavformat/avformat.h>
#import <libavcodec/avcodec.h>
#import <libswscale/swscale.h>
#import <libavutil/avutil.h>
#import <libswresample/swresample.h>
#import <libavdevice/avdevice.h>
#import <libavfilter/avfilter.h>
    
}