Coder Social home page Coder Social logo

astroyoung617 / rtmpserver Goto Github PK

View Code? Open in Web Editor NEW
23.0 1.0 5.0 584 KB

这个项目主要用于进行将RTP转发至RTMP服务器,它将实现将多路RTP流拉取、视频拼接缩放、音频混流,输出一份H.264视频及一份AAC音频使用ffmpeg的api封装为flv后发送至RTMP服务器上,可以是Bilibili、斗鱼、虎牙,或者是其他平台,更或者是推送至多平台同时播放。

License: MIT License

CMake 0.92% C++ 97.24% C 1.85%
rtp rtmp-server

rtmpserver's Introduction

rtmpServer🐥

简介

这个项目主要用于进行将RTP转发至RTMP服务器,它将实现将多路RTP流拉取、视频拼接缩放、音频混流,输出一份H.264视频及一份AAC音频至RTMP服务器上,可以是Bilibili、斗鱼、虎牙,或者是其他平台,更或者是推送至多平台同时播放。

小声bb: 目前以上内容还未完成,只测试了发送h264及aac文件或者mp4文件至rtmp服务器,完成了把这句话删了

框架

*RTPSENDER*                 *AUDIO/VIDEO RECEIVER*      *RTMPCLIENT*
+---------------------------+---------------------------+------------------------------+
|                           |                           |                              |
|                demux      |               decode      |                              |
|  mp4/file/ -------------->|  AVPacket  -------------->| AVFrame(YUV/RGB/pcm)         |
|   stream                  | h264(NALU)                |    |                         |
|                           |    aac                    |    |                         |
+---------------------------+---------------------------+    |sws_scale / mix          |
|                           |                           |    |    combine              |
|                  mux      |                encode     |    V                         |
|  rtmp/flv  <--------------|  AVPacket  <------------- |AVFrame(YUV/RGB/pcm)/uint8_t[]|
|                           |  h264/aac                 |                              |
|                           |                           |                              |
+---------------------------+---------------------------+------------------------------+
*NETMANAGER*                *AUDIO/VIDEO SENDER* 

发展

  • 2022.1.12 完成项目搭建,进行了MP4、h264、aac的rtmp发送测试,使用ffmpeg尝试了rtp发送测试,因为jrtplib被ban了,采用了live555这个开源的rtp库,完成了编译以及发送测试,待进行接收测试。
  • 2022.1.13 完成live555库的CMake链接,测试发送rtp遇到问题,使用官网中的测试程序发送ts文件过后,用vlc播放网络串流失败。
  • 2022.1.17 发现之前的方向错了,对RTP的理解还不够,今天安排先看文档和asio(non-boost)的使用和测试,编写客户端和服务器的echo程序。完成asio的udp、tcp服务器和异步客户端的程序测试,对于RTP而言,仍然使用了live555进行测试rtp的发送,目前进行了h264的发送测试,使用wireshark保存264文件验证能够正常播放。
  • 2022.1.18 编写RTP客户端及服务端,完成客户端发送RTP文本消息,服务端返回逆序RTP文本消息。
  • 2022.1.19 编写程序发送RTP音频数据,经过ffplay测试播放sdp可以正常播放。
  • 2022.1.19 编写程序发送RTP视频数据(h264),经过ffplay测试播放编写的sdp可以实现正常播放。
  • 2022.1.20 编写程序接收RTP音频(aac),测试可以直接播放,经过接收ffmpeg推送RTP流的测试及自己编写的RTP推流测试可以播放。
  • 2022.1.20 编写程序接收RTP视频(h264),测试可以直接播放,经过接收ffmpeg推送RTP流的测试及自己编写的RTP推流测试可以播放。
  • 2022.1.24 按照之间的架构设计进行编写代码,实现将之前完成的RTP接收保存至文件,但是发现一个问题,根据需求来看后面需要进行画面的拼接以及音频的混音,虽然发送的文件格式为aac和h264,但是我们如果要用ffmpeg的api来实现发送rtmp的话,就需要将其封装成avpacket,并且为了满足拼接及混音的要求,需要将其先解码(pcm\yuv)再编码(aac\h264);计划明天继续完成架构的设计以及对接收的RTP数据进行解码保存为yuv和pcm的测试。
  • 2022.1.25 完成对视频流的数据进行解码,将解码后的YUV保存到文件,经过测试可以正常播放。
  • 2022.1.26 完成对yuv的编码,并发送到b站,完成对aac的音频流解码保存为pcm
  • 2022.1.27 完成接收rtp流的h264、aac,发送rtmp到B站进行播放,进行了直接获取h264的AVPacket的操作,直接推送rtmp的AVPacket到B站,该方案可以在固定场景(只有一路音频或者视频的情况、或者只需要保存流的信息的情况)减少性能消耗(编解码),对于需要进行混音、拼接的情况不适用,并且一个功能完备的程序需要做到能够接收多种输入,一种输出,所以编解码可能还是必须的。
  • 2022.2.14 完成对aac、h264解码编码后发送至rtmp服务器;发现出现视频卡顿的现象,优先对其进行处理。
    • 使用rtmpServer进行推流到b站,发现播放时会出现频繁卡顿的现象,通过b站播放器的参数可以看到在buffer length比较小时卡顿现象较为明显,而buffer length处于递减的状态,只能通过暂停缓冲的方式使buffer length增大为2s或更大才能正常播放,同时通过观察download bitrate发现下载比特率一直处于较小的水平,这个可能是影响播放效果的主要原因。
  • 2022.2.15 解决播放卡顿的问题,一般情况下卡顿现象的发生是因为帧率,需要注意发送rtp的帧率是多少,然后发送rtmp的帧率又是多少,在某些情况下还不能忽略掉因为编解码而引发的延时,这一部分延时同样会影响帧率。如果发送的帧率大于接受的帧率那么出现卡顿的现象是必然的。
  • 2022.2.16 尝试创建多个receiver,并创建多种stl容器对相关的对象进行存储管理。
  • 2022.2.17 尝试了创建两个receiver,并同时接收两路rtp的音视频数据,发现出现花屏的现象,是因为还没有对视频进行拼接,但是目前也遇到一些问题,例如创建了多个receiver后,这个线程也相应的变多了,该怎么进行有效的管理?
  • 2022.2.22-2022.2.25 进行音画同步的尝试,目前的代码是根据接收的帧率进行发送与接收视频帧率相同的视频数据,那么对于接收多路不同帧率的视频流时可能出现问题,所以需要进行补帧或者丢帧而将其以相同的帧率进行发送;

LICENCE

MIT

rtmpserver's People

Contributors

astroyoung617 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

rtmpserver's Issues

接收H.264格式RTP流并保存至本地H.264文件

schedule:

  • 链接live555静态库;
  • 使用ffmpeg命令行发送H.264文件至RTP;
  • 测试使用live555进行RTP接收及解析功能;

note:

  • 保证输入输出一致,输出H.264文件可以正常播放。

进行多receiver测试及控制

通过控制台输入多个端口号来分别创建多个audio/videoReceiver,暂时将其用vector来进行存储,方便之后对其数据的拼接及混音。

解决播放卡顿问题

描述:
使用rtmpServer进行推流到b站,发现播放时会出现频繁卡顿的现象,通过b站播放器的参数可以看到在buffer length比较小时卡顿现象较为明显,而buffer length处于递减的状态,只能通过暂停缓冲的方式使buffer length增大为2s或更大才能正常播放,同时通过观察download bitrate发现下载比特率一直处于较小的水平,这个可能是影响播放效果的主要原因。

通过使用potPlayer测试与上述现象一致。

音画同步调整和测试

使用计时的视频画面和音频进行测试,按照以下顺序进行观察:

  1. 视频播放时间和实际经过的时间是否一致?(慢或快)
  2. 音频播放的时间和实际经过的时间是否一致?(慢或快)
  3. 视频和音频之间的差值(可能为0)是否稳定?
  4. 开始时是否同步?
  5. 刷新后是否同步?
  6. 刷新后呈现什么样的变化?(音频是否跳跃,视频是否跳跃,造成跳跃的原因可能是播放器对视频或音频有较多的缓存,每次刷新后清空(或一部分)缓存重新获取。

编写客户端和服务端程序

确认RTP协议能够正常工作

  • 客户端采用RTP发送文本消息
  • 服务端收到后对消息进行逆序后,通过RTP进行返回
  • 客户端接收到服务端的RTP数据后,输出到控制台

同时发送aac、h.264到rtp

为了进行音画同步测试首先要进行同时发送rtp。如果用ffmpeg的命令行进行发送做不到同时的效果,所以需要对之前分开发送的代码进行整合,使其同时发送。

尝试输出到多个平台

想到一个思路去进行同时推流到多个平台,经过尝试该思路正确可以成功输出到b站和斗鱼,但是需要完善和进行命令行交互的控制。

尝试修改视频帧率

在测试文件changeFrameRate和实际项目代码中进行提升帧率,发现可以实现并且效果不错。通过直接对frame进行补帧和丢帧的方式,相较于packet还要判断IPB帧而言更加稳定方便。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.