音视频开发系列(4):完成rtmp推流vlc拉流

FFmpeg实现实时视频推流:从编码到播放的全流程
本文介绍了如何使用ffmpeg将视频和音频数据通过rtmp协议推流到nginx服务器,并通过调整解码时间和发送时间同步避免播放卡顿,以实现流畅直播。作者详细讲解了关键步骤,包括AVPacket时间戳转换和VLC播放器的设置。

上节分享了打印AVPacket中的时间戳信息,这节准备分享一下利用rtmp协议将视频和音频数据推流到nginx服务器上并利用vlc来进行拉流播放视频,达到直播的效果。

由于AVPacket包数据中的解码时间戳dts、显示时间戳pts是使用输入流来进行配置的,上节分享的是利用av_read_frame()函数读取数据,由于第一个参数是输入流的帧,所以配置的dts和pts就是输入流的配置,要想用输出流的pts、dts配置,可以利用ffmpeg中的int64_t av_rescale_q_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd); 函数来进行转化,该函数的原理是:

可以假设原来的dts为x,利用c来作为度量的值为y,这样就可以列出两个方程式

x/b=a ,x/c=y ,所以a*b=c*y,及最后的y=a*b/c;转化的代码如下,

		AVRational itime = ictx->streams[pkt.stream_index]->time_base;
		AVRational otime = octx->streams[pkt.stream_index]->time_base;
		pkt.pts=av_rescale_q_rnd(pkt.pts,itime,otime,(AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
		pkt.dts = av_rescale_q_rnd(pkt.dts, itime, otime, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
		pkt.duration = av_rescale_q_rnd(pkt.duration, itime, otime, (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
		pkt.pos = -1;

最后再利用ffmpeg的av_usleep()函数来进行延时即可实现推流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值