iOS利用ffmpeg 转码hevc到h264 ,以及 保存h265 h264流

Posted _Roy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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"文件夹
    技术图片

编译FFmpeg + x264

1. 下载FFmpeg 编译脚本:

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容器

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






以上是关于iOS利用ffmpeg 转码hevc到h264 ,以及 保存h265 h264流的主要内容,如果未能解决你的问题,请参考以下文章

[树莓派]aarch64编译静态的ffmpeg 可硬解h264/hevc

有没有办法在转码之前使用 ffmpeg 来确定文件的编码?

如何将yuv编码为h264,自己编码或者ffmpeg都可以。

如何使用ffmpeg实现h264流传输+H264实现RTP传输数据

ffmpeg for iOS

ffmpeg 怎么把h264文件转成MP4