iOS利用ffmpeg 轉碼hevc到h264 ,以及 保存h265 h264流


下載ffmpeg,並且將libx264編譯進去

1.下載gas-preprocessor文件

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"文件夾
    x264-iOS

編譯FFmpeg + x264

1. 下載FFmpeg 編譯腳本:

2. 編譯FFmpeg

  • 終端運行 ./build-ffmpeg.sh arm64,因為我的代碼只需要arm64
  • 編譯完成之后,目錄生成
    FFmpeg-ios

創建轉碼項目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容器

源代碼地址: https://github.com/Noying/transcode_hevc2h264



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM