x264直播(3) - http-flv直播输出

继续, x264代码中已经有flv输出, 直播可以另外加入一个http的组件, 我是自己单独弄个简单的tcp

  1. 添加一个输出接口 cli_output_t http_flv_output
  2. 接口可以从flv 集成, 也可以全复制过来修改, 主要把写文件的代码改成写到http上去
  3. flv本身是一种流的方式, 基本上直接输出到http就可以了, 但是在用户连接时还是需要先输出http头, 视频头
    http传输使用chunk方式, http头如下(跨域问题)

"HTTP/1.1 200 OK\r\n"
"Server: x264-HTTP\r\n"
"Content-Type: application/octet-stream\r\n"
"Transfer-Encoding: chunked\r\n"
"Connection: keep-alive\r\n"
"Access-Control-Allow-Origin: *\r\n"
"\r\n";

  1. flv头, 如果没有flv头也是不行的, 在运行开始的时候, 生成的就是数据头,把这些数据先存起来, 等有http客户连接时先发送这些头
    生成头的地方主要2个: open_file, write_headers

  2. 客户端连接时无法立即出现图像, 因为x264编码生成的帧一般为IBBP, 默认250帧一个关键帧, 需要等待比较久
    正确解码需要I帧也就是关键帧, 可以在连接时强制生成一个关键帧, 就可以了
    a. 添加x264_param_t.key_frame_onece
    b. x264_encoder_encode 中判断 key_frame_onece 强制生成关键帧
    c. 在库中添加x264_encoder_param 返回参数 x264_param_t
    d. 在连接时设置 key_frame_onece

  3. 直播延时问题

    1. zerolatency 选项启用后服务器端基本没什么延迟了
    2. 客户端不同播放器延迟差别很大, 可以确认延迟基本在客户端解码这边
      vlc播放器延迟 6s左右, 可以加速模式播放同步到1s内
      flv.js播放延迟 4s左右, 还有累积延迟
      ckplayer 播放器延迟最小可以在1s以内(swf), 移动端有问题
posted @ 2020-10-29 14:45  Yofoo  阅读(208)  评论(0编辑  收藏  举报