下載ffmpeg,並且將libx264編譯進去
1.下載gas-preprocessor文件
- https://github.com/libav/gas-preprocessor
- 將里面的gas-preprocessor.pl拷貝到/usr/local/bin
- 修改文件權限
chomd 777 /usr/local/bin/gas-preprocessor.pl
2. 下載x264源碼:
3. 下載x264編譯腳本:
4. 將源碼與腳本放在一起
- 新建一個文件夾,將編譯腳本build-x264.sh與x264源碼文件夾放入這個新建文件夾中,並將x264文件夾(x264-snapshot-xxxx)改名為"x264"
5. 修改權限、執行腳本
- sudo chmod u+x build-x264.sh
- sudo ./build-x264.sh
- 編譯過程中會生成scratch-x264文件夾與thin-x264文件夾
- 編譯完成最終會生成"x264-iOS"文件夾
編譯FFmpeg + x264
1. 下載FFmpeg 編譯腳本:
- https://github.com/kewlbear/FFmpeg-iOS-build-script
- 去掉腳本 build-ffmpeg.sh中的 #x264 =`pwd`/fat-x264 的注釋
- 將x264編譯出來的lib庫文件夾放入ffmpeg編譯腳本的文件夾中,並改名為"fat-x264"
2. 編譯FFmpeg
- 終端運行 ./build-ffmpeg.sh arm64,因為我的代碼只需要arm64
- 編譯完成之后,目錄生成
創建轉碼項目Test264
1. 創建fftools,命令行方式
- 導入文件
cmdutils_common_opts.h
cmdutils.c
cmdutils.h
config.h
ffmpeg_filter.c
ffmpeg_opt.c
ffmpeg_videotoolbox.c
ffmpeg.c
ffmpeg.h
ffprobe.c
- 設置Header Search Paths
- 改bitcode為NO
- 修改 ffmpeg.c中main函數為 ffmpeg_main
- cmdutils.c修改 exit_program
`
int exit_program(int ret)
{
// if (program_exit)
// program_exit(ret);
//
// exit(ret);
return ret;
}
`
- ffmpeg.c文件中,計數器置零, 在 term_exit(); 前面將5個參數置零(修復多次調用可能引起crash
`
nb_filtergraphs=0;
nb_output_files=0;
nb_output_streams=0;
nb_input_files=0;
nb_input_streams=0;
term_exit();
ffmpeg_exited = 1;
`
- 項目還需要添加系統庫
AudioToolbox.framework
CoreMedia.framework
VideoToolbox.framework
libiconv.tdb
libbz2.tdb
libz.tdb
2. 使用代碼轉碼
- 加入另一個轉碼 transcoding.c,這個是examples里獲取的,目錄地址根據不同版本的ffmpeg可能不一樣,搜索全文件夾就行了,這里我只講,我修改了transcoding.c的位置
- 第一個我是 強制轉化為h264,所以在open_output_file 處修改轉出的格式
`
if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
encoder = avcodec_find_encoder(AV_CODEC_ID_H264); //視頻強制為h264
}
else{
encoder = avcodec_find_encoder(AV_CODEC_ID_AAC); //聲波轉為aac
}
`
- 為了能夠去掉 broken ffmpeg default settings detected 錯誤
`
enc_ctx->me_range = 16;
enc_ctx->max_qdiff = 4;
enc_ctx->qmin = 10;
enc_ctx->qmax = 51;
enc_ctx->qcompress = 0.6;
`
- 視頻質量跟碼率有關,稍微提高點碼率
- 提示 application dts 190>16 ,是因為 av_interleaved_write_frame 返回了-22 ,這里我屏蔽掉這個錯誤,直接編寫
3. h265編碼
- ffmpeg 后面的版本都不支持 AVCodecContext 設置參數了,而是改為AVCodecContext.codecpar 去修改參數
- 我這里是為了適應iphone 的hevc視頻,fourcc設置為hvc1,只有設置了這個才可以在iphone上預覽,我使用ffmpeg 3.3.3版本,fourcc支持mov容器,而不支持mp4容器