引入ffmpeg引发的一系列问题

419 阅读1分钟

利用ffmpeg来进行视频转码,记录下主要步骤(仅提供思路):

  1. github上FFmpeg-iOS-build-script或者ijkplayer都可以获取到ffmpeg。
  2. 将ffmpeg的lib,include及fftools整理出来拖进项目当中。

截屏2022-06-19 22.30.00.png

3.lib中的.a需要依赖系统frameworks = 'AudioToolbox', 'CoreAudio' , 'VideoToolbox', 'CoreMedia', 'AVFoundation',libraries = 'libbz2', 'libiconv', 'libz'。

4.将include中libavdevice中的time.h改个名,因与系统库重名。

5.若在pch文件中导入了foundation等的,请先#ifdef objc 再导入。

6.header search path需要设置include的path。

7.需要注释一些找不到文件和无用的方法。

 nb0_frames = nb_frames = mid_pred(ost->last_nb0_frames[0],
                                          ost->last_nb0_frames[1],
                                          ost->last_nb0_frames[2]);

 ff_dlog(NULL, "force_key_frame: n:%f n_forced:%f prev_forced_n:%f t:%f prev_forced_t:%f -> res:%f\n",
                    ost->forced_keyframes_expr_const_values[FKF_N],
                    ost->forced_keyframes_expr_const_values[FKF_N_FORCED],
                    ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_N],
                    ost->forced_keyframes_expr_const_values[FKF_T],
                    ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_T],
                    res);

PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);
PRINT_LIB_INFO(postproc, POSTPROC, flags, level);

下面两项可以通过在config中disable掉,也可以选择注释代码
{ "videotoolbox_pixfmt", HAS_ARG | OPT_STRING | OPT_EXPERT, { &videotoolbox_pixfmt}, "" },

{ "videotoolbox",   videotoolbox_init,   HWACCEL_VIDEOTOOLBOX,   AV_PIX_FMT_VIDEOTOOLBOX },

8.在ffmpeg.c中找到 ffmpeg_cleanup 方法,在 term_exit() 前,将各个计数器置零:

    nb_filtergraphs=0;
    nb_output_files=0;
    nb_output_streams=0;
    nb_input_files=0;
    nb_input_streams=0;

9.在ffmpeg.cffmpeg_main函数中,把所有调用 exit_program 函数 ,改为调用 ffmpeg_cleanup 函数。

10.include中的各个头文件中可能有很多version是同名的,改一下名字。

按照这个步骤执行碰到解决不了的搜搜自行解决。

有种情况会出现不同的两个framework都同时包含ffmpeg的lib,此时应用在运行时会出现链接出错的情况,这个时候需要framework提供方提供相同version,相同config的ffmpeg的lib和include,只有这样才能行。