上节分享了打印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()函数来进行延时即可实现推流。
FFmpeg实现实时视频推流:从编码到播放的全流程

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

被折叠的 条评论
为什么被折叠?



