基于FFMPEG API開發(fā)RTMP推流器(二)

本文將在《基于FFMPEG API開發(fā)RTMP推流器》的基礎(chǔ)上介紹如何將StreamPusher的FFMPEG版本如何從2.3.6升級到4.0.2

  • 添加命名空間
using namespace std;

防止編譯可以通過,但IDE總是報有些變量找不到(紅色波浪線那種)。

正題

上節(jié)我們?yōu)榱四苷>幾g運行,暫時先把sdl給關(guān)掉了,這次我們將它打開,再次編譯,看都會報哪些錯誤:
如下圖


圖1

接下來我們一個個的分析修改

'av_register_all': 被聲明為已否決

其實就是av_register_all()這個方法在FFMPEG 4.0以后將不再推薦使用,而且是非必需的,因此直接注釋掉即可。

'AVStream::codec': 被聲明為已否決

AVStream的codec成員從3.3版本及以后不再推薦使用,推薦使用codecpar,主要原因是解決編碼與流封包數(shù)據(jù)結(jié)構(gòu)耦合性太高。我們可以做如下處理:

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參數(shù)就得透過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()替換

運行

經(jīng)過上述修改,我們的程序已經(jīng)可以正常編譯通過了。
運行下,如下圖,正常,搞定!


圖2

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容