利用ffmpeg来进行视频转码,记录下主要步骤(仅提供思路):
- github上FFmpeg-iOS-build-script或者ijkplayer都可以获取到ffmpeg。
- 将ffmpeg的lib,include及fftools整理出来拖进项目当中。
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.c的ffmpeg_main函数中,把所有调用 exit_program 函数 ,改为调用 ffmpeg_cleanup 函数。
10.include中的各个头文件中可能有很多version是同名的,改一下名字。
按照这个步骤执行碰到解决不了的搜搜自行解决。
有种情况会出现不同的两个framework都同时包含ffmpeg的lib,此时应用在运行时会出现链接出错的情况,这个时候需要framework提供方提供相同version,相同config的ffmpeg的lib和include,只有这样才能行。