美文网首页
基于FFMPEG API开发RTMP推流器(二)

基于FFMPEG API开发RTMP推流器(二)

作者: onroad_tech | 来源:发表于2018-11-13 15:03 被阅读0次

    本文将在《基于FFMPEG API开发RTMP推流器》的基础上介绍如何将StreamPusher的FFMPEG版本如何从2.3.6升级到4.0.2

    • 添加命名空间
    using namespace std;
    

    防止编译可以通过,但IDE总是报有些变量找不到(红色波浪线那种)。

    正题

    上节我们为了能正常编译运行,暂时先把sdl给关掉了,这次我们将它打开,再次编译,看都会报哪些错误:
    如下图


    图1

    接下来我们一个个的分析修改

    'av_register_all': 被声明为已否决

    其实就是av_register_all()这个方法在FFMPEG 4.0以后将不再推荐使用,而且是非必需的,因此直接注释掉即可。

    'AVStream::codec': 被声明为已否决

    AVStream的codec成员从3.3版本及以后不再推荐使用,推荐使用codecpar,主要原因是解决编码与流封包数据结构耦合性太高。我们可以做如下处理:

    for(i=0; i<ifmt_ctx->nb_streams; i++) 
        if(ifmt_ctx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){
            videoindex=i;
            break;
        }
    

    修改 为

    for (i = 0; i < ifmt_ctx->nb_streams; i++) {
        if (ifmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
            videoindex = i;
            break;
        }
    }
    

    但下面这个就不能简单地将codec替换成codecpar,因为codecpar没有codec这个成员变量。

    AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
    

    avformat_new_stream()的AVCodec参数就得透过avcodec_find_decoder()获取

    AVCodec *avcodec = avcodec_find_decoder(in_stream->codecpar->codec_id);
    AVStream *out_stream = avformat_new_stream(ofmt_ctx, avcodec);
    

    'avcodec_copy_context': 被声明为已否决

    新版本中FFmpeg的avcodec_copy_context()方法已被avcodec_parameters_to_context()和avcodec_parameters_from_context()所替代,因此

    ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
    if (ret < 0) {
        printf( "Failed to copy context from input to output stream codec context\n");
        goto end;
    }
    out_stream->codec->codec_tag = 0;
    if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
        out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
    

    需要改写为

    AVCodecContext *codec_ctx = avcodec_alloc_context3(avcodec);
    ret = avcodec_parameters_to_context(codec_ctx, in_stream->codecpar);
    if (ret < 0) {
        printf("Failed to copy context from input to output stream codec context\n");
        goto end;
    }
    codec_ctx->codec_tag = 0;
    if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
        codec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
    
    ret = avcodec_parameters_from_context(out_stream->codecpar, codec_ctx);
    

    'av_free_packet': 被声明为已否决

    av_free_packet()可被av_free_packet()替换

    运行

    经过上述修改,我们的程序已经可以正常编译通过了。
    运行下,如下图,正常,搞定!


    图2

    完整代码可到我的github下载:
    https://github.com/onroadtech/live
    branch: master

    相关文章

      网友评论

          本文标题:基于FFMPEG API开发RTMP推流器(二)

          本文链接:https://www.haomeiwen.com/subject/ychlfqtx.html