【Android RTMP】x264 编码器初始化及设置 ( 获取 x264 编码参数 | 编码规格 | 码率 | 帧率 | B帧个数 | 关键帧间隔 | 关键帧解码数据 SPS PPS )(三)

简介: 【Android RTMP】x264 编码器初始化及设置 ( 获取 x264 编码参数 | 编码规格 | 码率 | 帧率 | B帧个数 | 关键帧间隔 | 关键帧解码数据 SPS PPS )(三)

七、 设置 x264 编码器 编码帧相关参数


1 . 关键帧解码数据 : 关键帧及后面的帧如何解码 , 需要根据 SPS , PPS 数据进行解码 ;



2 . 关键帧间距 : 这里使用 fps 描述关键帧之间的间距 , 2 秒一个关键帧 ;




3 . B 帧个数 : B 帧解码时, 既要参考前面的帧, 又要参考后面的帧 ;



① B 帧存在的意义 : 减小视频流的大小 ;


② B 帧存在的弊端 : 增加解码时间 ;


③ 直播场景的选择 : 直播中实时性性能很重要 , 因此这里选择不编码 B 帧 , 直接将 B 帧个数设置为 0 ;




4 . 特殊场景考虑 : 当前开发需求是直播 , 用户可能在任意时间进入直播间 ;



① 解码数据 SPS / PPS : 如果关键帧后面没有自带解码数据 , 那么用户如果进入该直播间 , 将无法观看直播 , 建议关键帧携带 SPS / PPS 解码数据 ;


② 关键帧间距 : 如果关键帧间距太长 , 用户在关键帧空档期间进入直播间 , 那么需要等到下一个关键帧到来 , 才能观看直播 , 建议将帧间距设置在 10 秒以内 ;


/*
   关键帧数据 I 是否附带 SPS PPS 数据
   编码后, 会输出图像编码后的数据
   第一个图像数据输入到 x264 编码器后, 进行编码
   编码的第一个图像编码出来的数据 肯定是 SPS PPS 关键帧 三种数据
   SPS PPS 作用是告知后续如何解码视频中的图像数据
   第二个图像数据输入到 x264 编码器后, 进行编码
   编码的第二个图像编码出来的数据 是 P 帧
   后续 n 个图像编码出 n 个 P 帧
   第 n + 3 个图像又编码出一个关键帧 I
   任何一个画面都可以编码成关键帧
   直播时建议设置成 1
   因为中途会有新用户加入, 此时该用户的播放器必须拿到 SPS PPS 才能解码画面
   否则无法观看视频
   如果设置成 0, 那么就需要开发者自己维护 SPS PPS 数据
   保证后来的用户可以看到直播画面
 */
x264Param.b_repeat_headers = 1;
// 计算帧间距的依据, 该设置表示使用 fps 帧率计算帧间距
// 两帧之间间隔多少 fps
// 也可以使用时间戳计算帧间距
x264Param.b_vfr_input = 0;
/*
   关键帧的间距, 两个关键帧之间的距离
   fps 表示 1 秒钟画面帧的数量, fps * 2 表示 2 秒钟的帧数
   该设置表示每隔 2 秒, 采集一个关键帧数据
   关键帧间隔时间不能太长
   关键帧间隔不能设置太长, 如设置 10 秒
   当用户1观看直播时, 不影响观看
   当用户2进入房间, 此时刚过去一个关键帧, 10秒内没有关键帧
   该用户需要等待 10 秒后收到关键帧数据后, 才有画面显示出来
 */
x264Param.i_keyint_max = fps * 2;
// 设置 B 帧个数, 这里设置没有 B 帧, 只有 I 帧和 P 帧
// B 帧解码时, 既要参考前面的帧, 又要参考后面的帧
// B 帧能减少传输的数据量, 但同时降低了解码速度, 直播中解码速度必须要快
x264Param.i_bframe = 0;





八、 x264 编码器参数设置代码示例


x264 编码器参数设置代码示例 :


// 设置 x264 编码器参数
    x264_param_t x264Param;
    /*
     * 获取 x264 编码器参数
     * int x264_param_default_preset( x264_param_t *, const char *preset, const char *tune )
     * 参数一 : x264_param_t * : x264 编码参数指针
     *
     * 参数二 : const char *preset : 设置编码速度, 这里开发直播, 需要尽快编码推流,
     * 这里设置最快的速度 ultrafast, 字符串常量, 值从 下面的参数中选择 ;
     * static const char * const x264_preset_names[] = { "ultrafast", "superfast", "veryfast",
     * "faster", "fast", "medium", "slow", "slower", "veryslow", "placebo", 0 };
     *
     * 参数三 : const char *tune : 视频编码场景设置, 这里选择 zerolatency 无延迟编码
     * static const char * const x264_tune_names[] = { "film", "animation", "grain",
     * "stillimage", "psnr", "ssim", "fastdecode", "zerolatency", 0 };
     *
     * 编码速度快, 意味着牺牲了画面的质量
     */
    x264_param_default_preset(&x264Param, "ultrafast", "zerolatency");
    // 编码规格设定, 32 对应的是 3.2 编码规格, 该规格下有指定的 码率, 帧率要求
    // 参考 https://www.wanweibaike.com/wiki-H.264 中的最大性能级别
    x264Param.i_level_idc = 32;
    // 设置输入到 x264 编码器的数据格式, 宽度, 高度等参数
    x264Param.i_csp = X264_CSP_I420;
    x264Param.i_width = mWidth;
    x264Param.i_height = mHeight;
    /*
       设置码率相关参数
       码率有三种模式 : X264_RC_CQP 恒定质量, X264_RC_CRF 恒定码率, X264_RC_ABR 平均码率
       这里设置一个平均码率输出
     */
    x264Param.rc.i_rc_method = X264_RC_ABR;
    // 设置码率, 单位是 kbps
    x264Param.rc.i_bitrate = bitrate / 1000;
    // 设置最大码率, 单位 kbps, 该配置与 i_vbv_buffer_size 配套使用
    x264Param.rc.i_vbv_max_bitrate = bitrate / 1000 * 1.2;
    // 该配置与 i_vbv_max_bitrate 配置配套使用, 码率控制缓冲区大小
    x264Param.rc.i_vbv_buffer_size = bitrate / 1000;
    // 设置帧率相关参数, 帧率是个有理数, 使用分数形式表示
    x264Param.i_fps_num = fps;  // 分子
    x264Param.i_fps_den = 1;    // 分母
    x264Param.i_timebase_den = x264Param.i_fps_num; //分子
    x264Param.i_timebase_num = x264Param.i_fps_den; //分母
    // 下面是关于帧的先关设置
    /*
       关键帧数据 I 是否附带 SPS PPS 数据
       编码后, 会输出图像编码后的数据
       第一个图像数据输入到 x264 编码器后, 进行编码
       编码的第一个图像编码出来的数据 肯定是 SPS PPS 关键帧 三种数据
       SPS PPS 作用是告知后续如何解码视频中的图像数据
       第二个图像数据输入到 x264 编码器后, 进行编码
       编码的第二个图像编码出来的数据 是 P 帧
       后续 n 个图像编码出 n 个 P 帧
       第 n + 3 个图像又编码出一个关键帧 I
       任何一个画面都可以编码成关键帧
       直播时建议设置成 1
       因为中途会有新用户加入, 此时该用户的播放器必须拿到 SPS PPS 才能解码画面
       否则无法观看视频
       如果设置成 0, 那么就需要开发者自己维护 SPS PPS 数据
       保证后来的用户可以看到直播画面
     */
    x264Param.b_repeat_headers = 1;
    // 计算帧间距的依据, 该设置表示使用 fps 帧率计算帧间距
    // 两帧之间间隔多少 fps
    // 也可以使用时间戳计算帧间距
    x264Param.b_vfr_input = 0;
    /*
       关键帧的间距, 两个关键帧之间的距离
       fps 表示 1 秒钟画面帧的数量, fps * 2 表示 2 秒钟的帧数
       该设置表示每隔 2 秒, 采集一个关键帧数据
       关键帧间隔时间不能太长
       关键帧间隔不能设置太长, 如设置 10 秒
       当用户1观看直播时, 不影响观看
       当用户2进入房间, 此时刚过去一个关键帧, 10秒内没有关键帧
       该用户需要等待 10 秒后收到关键帧数据后, 才有画面显示出来
     */
    x264Param.i_keyint_max = fps * 2;
    // 设置 B 帧个数, 这里设置没有 B 帧, 只有 I 帧和 P 帧
    // B 帧解码时, 既要参考前面的帧, 又要参考后面的帧
    // B 帧能减少传输的数据量, 但同时降低了解码速度, 直播中解码速度必须要快
    x264Param.i_bframe = 0;
    // 是否开启多线程
    x264Param.i_threads = 1;



目录
相关文章
|
18天前
|
消息中间件 网络协议 Java
Android 开发中实现数据传递:广播和Handler
Android 开发中实现数据传递:广播和Handler
16 1
|
4天前
|
Java Linux API
统计android设备的网络数据使用量
统计android设备的网络数据使用量
14 0
|
1天前
|
Android开发 数据库管理
Android如何在Activity和Service之间传递数据
Android如何在Activity和Service之间传递数据
|
2天前
|
XML JSON API
转Android上基于JSON的数据交互应用
转Android上基于JSON的数据交互应用
|
2天前
|
JSON Android开发 数据格式
android与Web服务器交互时的cookie使用-兼谈大众点评数据获得(原创)
android与Web服务器交互时的cookie使用-兼谈大众点评数据获得(原创)
11 2
|
25天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android's AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
11 0
|
25天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
14 0
|
1月前
|
JSON 安全 Java
Android网络部分-----网络数据请求、解析
Android网络部分-----网络数据请求、解析
Android网络部分-----网络数据请求、解析
|
1月前
|
XML Java Android开发
Android每点击一次按钮就添加一条数据
Android每点击一次按钮就添加一条数据
24 1
|
2月前
|
Android开发
Android 数据传递的几种方式,HttpLoggingInterceptor消息拦截器
Android 数据传递的几种方式,HttpLoggingInterceptor消息拦截器
22 6