FFmpeg RTSP转RTMP 在VLC上可以播放 网页上无法播放

问题


简单说明一下: 我是使用FFMPeg的SDK 自己敲的代码将RTSP流转RTMP流推到Nginx-rtmp上的

然后用VLC测试画面正常,但是前端同学拿过去用的时候就是左图的样子, 最后百度了好几天,期间也没什么人会帮助你,最后原因就是编码器的问题

原先的编码器参数: 

//a 找到编码器

    AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);

    if (!codec) return 1;

    //b 创建编码器上下文

    vc = avcodec_alloc_context3(codec);

    if (!vc) return 1;

    //c 配置编码器参数

//    vc->codec_type = AVMEDIA_TYPE_VIDEO;

    vc->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; //全局参数

    vc->codec_id = codec->id;

    vc->codec_type = AVMEDIA_TYPE_VIDEO;

    vc->thread_count = 8;

    vc->bit_rate = 50 * 1024 * 8;//压缩后每秒视频的bit位大小 50kB

    vc->width = inWidth;

    vc->height = inHeight;

    vc->time_base = { 1,fps };

    vc->framerate = { fps,1 };

    //画面组的大小,多少帧一个关键帧

    vc->gop_size = 50;

    vc->max_b_frames = 0;

    vc->pix_fmt = AV_PIX_FMT_YUV420P;

修改后的编码器参数:

//a 找到编码器

    AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);

    if (!codec) return 1;

    //b 创建编码器上下文

    vc = avcodec_alloc_context3(codec);

    if (!vc) return 1;

    //c 配置编码器参数

//    vc->codec_type = AVMEDIA_TYPE_VIDEO;

    vc->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; //全局参数

    vc->codec_id = codec->id;

    vc->codec_type = AVMEDIA_TYPE_VIDEO;

    vc->thread_count = 8;

    vc->bit_rate = 50 * 1024 * 8;//压缩后每秒视频的bit位大小 50kB

    vc->width = inWidth;

    vc->height = inHeight;

    vc->time_base = { 1,fps };

    vc->framerate = { fps,1 };

    //画面组的大小,多少帧一个关键帧

    vc->gop_size = 50;

    vc->max_b_frames = 0;

    vc->pix_fmt = AV_PIX_FMT_YUV420P;

    if (codec->id == AV_CODEC_ID_H264)

    {

        av_opt_set(vc->priv_data, "preset", "ultrafast", 0); //ultrafast

    }

    av_opt_set(vc->priv_data, "tune", "zerolatency", 0);

分析:

可以看到就是加了下面两句

 if (codec->id == AV_CODEC_ID_H264)

    {

        av_opt_set(vc->priv_data, "preset", "ultrafast", 0); //ultrafast

    }

    av_opt_set(vc->priv_data, "tune", "zerolatency", 0);

然后就有画面了, 这两行代码是解决延迟的问题. 

你可能感兴趣的:(FFmpeg RTSP转RTMP 在VLC上可以播放 网页上无法播放)