本文记录基于 ffmpeg 的推流器,通过 rtsp 方式从输入端流媒体服务器拉流,再通过 rtmp 方式推流到输出端的流媒体服务器,如下图所示的流程:
拉流及推流的流程
程序的拉流和推流的流程见下面的流程图所示:
- avformat_network_init:因使用了网络进行拉流和推流处理,需要先初始化;如只是本地的文件处理,不需要初始化网络。
- avformat_alloc_output_context2:指定输出格式的名称为 flv
源代码
1 |
|
需要注意的地方
- 封装格式:RTMP采用的封装格式是 FLV,在指定输出流媒体的时候,需要指定其封闭格式为 flv
- 其他流媒体协议也需要指定其封装格式,如 UDP 推送流媒体的时候,可指定封装格式为 mpegts
- 关于时间戳问题:参照 雷神 和 叶余 的文章处理,都出现第一帧时间戳晚于第二帧时间戳的情况,所以程序在收到第一帧时,将 dts 和 pts 置为 0。