ffmpeg接口实现rtmp推流

学习雷博士的文章

《最简单的基于FFmpeg的推流器(以推送RTMP为例)》

环境:Ubuntu 16.04.7

ffmpeg-6.1

1、下载雷博士测试代码

https://github.com/leixiaohua1020/simplest_ffmpeg_streamer

测试 simplest_ffmpeg_streamer/simplest_ffmpeg_streamer.cpp

程序流程图搬过来:

接口说明:

avformat_open_input()

打开输入文件,初始化输入视频码流的AVFormatContext

av_read_frame()

从输入文件中读取一个AVPacket

avformat_alloc_output_context2()

初始化输出视频码流的AVFormatContext

avformat_new_stream()

创建输出码流的AVStream

avio_open()

打开输出文件

avformat_write_header()

写文件头(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)

av_interleaved_write_frame()

将AVPacket(存储视频压缩码流数据)写入文件

av_write_trailer()

写文件尾(对于某些没有文件头的封装格式,不需要此函数。比如说MPEG2TS)

笔者用的是ffmpeg-6.1,有些接口变化了

1)av_register_all 废弃

url改成自己的rtmp服务器

2)

旧版本:
if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){
新版本:
if(pFormatCtx->streams[i]->codecpar->codec_type==AVMEDIA_TYPE_VIDEO){

3)

旧版本:

ret = avcodec_copy_context(out_stream->codec, in_stream->codec);

新版本:

ret = avcodec_parameters_copy(out_stream->codecpar, in_stream->codecpar);

旧版本:

CODEC_FLAG_GLOBAL_HEADER

新版本:

/**
 * Place global headers in extradata instead of every keyframe.
 */
#define AV_CODEC_FLAG_GLOBAL_HEADER   (1 << 22)

置位则表示SPS/PPS放在extradata,而不是I帧前面

flags 在结构体 AVCodecContext中

    /**
     * AV_CODEC_FLAG_*.
     * - encoding: Set by user.
     * - decoding: Set by user.
     */
    int flags;

4)

旧版本:

av_free_packet(&pkt);

新版本:

av_packet_unref(&pkt);

2、编译测试代码

gcc simplest_ffmpeg_streamer.cpp -o simplest_ffmpeg_streamer.out -I ../ffmpeg_dir/include/ -L ../ffmpeg_dir/lib/ -L ../x264_dir/lib -lavformat -lavcodec -lavutil -lswresample -lx264

3、运行

export LD_LIBRARY_PATH=xx/ffmpeg_dir/lib/:xx/x264_dir/lib

笔者用nginx搭建的rtmp服务器

./simplest_ffmpeg_streamer.out

4、mark

[总结]RTMP流媒体技术零基础学习方法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值