C# 利用FluorineFx-4.0 RTMP-Server 真实可用

   日期:2020-08-25     浏览:130    评论:0    
核心提示:RTMPServer Rtmp服务器利用FluorineFx-4.0开发RtmpServer效果展示代码展示操作流程遗留问题未来计划项目说明项目下载地址利用FluorineFx-4.0开发RtmpServer效果展示Rtmp客户端使用手机导播软件可以实现Rtmp推流,我用的是芯象导播。Rtmp接收流是自己写的服务。图片如下:代码展示 /// /// 初始化按钮 /// ///

C# RTMPServer Rtmp服务器

  • 利用FluorineFx-4.0开发RtmpServer
    • 效果展示
    • 代码展示
    • 操作流程
    • 遗留问题
    • 未来计划
    • 项目说明
    • 项目下载地址
    • 欢迎留言交流

利用FluorineFx-4.0开发RtmpServer

效果展示

Rtmp客户端使用手机导播软件可以实现Rtmp推流,我用的是芯象导播。Rtmp接收流是自己写的服务。图片如下:

代码展示

  /// <summary>
        /// 初始化按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //创建一个多路推送的地址列表
            RtmpPushTable table = new RtmpPushTable();
            table.RtmpPullKeys = new List<RtmpPushKey>();

            RtmpPushKey key = new RtmpPushKey();
            key.KeyName = "tt";
            key.Channels = new List<RtmpPushChannel>();
            RtmpPushChannel channel = new RtmpPushChannel();
            string id = "0";
            channel.ChannelId = id;
            channel.RtmpStreamKey = "aabbccdd";
            channel.Cache = 0;
            key.Channels.Add(channel);


            table.RtmpPullKeys.Add(key);
            Console.WriteLine("-------------------RtmpPush1111111111111111111");

            //开启Rtmp服务并注册回调
            FLApplication.Start(RtmpHandshakeIPPoint, table);
            FLApplication.Flapp_DisConnect -= FLApplication_Flapp_DisConnect;
            FLApplication.Flapp_DisConnect += FLApplication_Flapp_DisConnect;
            FLApplication.Flapp_BroadCast -= FLApplication_Flapp_BroadCast;
            FLApplication.Flapp_BroadCast += FLApplication_Flapp_BroadCast;
            //音频相关配置

            aCfg = AudioEncodeCfg.GetDefault();
            aCfg.frequency = param.Frequency;
            aCfg.bitrate = param.Bitrate;
            aCfg.keyFrameRate = param.KeyFrameRate;
            aCfg.SetEncoder("AAC_");

            //音视频播放器启动
            _mp.IsVideoPlay = true;
            _mp.IsAudioPlay = true;
            _mp.Start();

        }
//接收到Rtmp流的回调函数
   private void RtmpDataCallBack(byte[] data, uint dataLen, int mediaType, int isKeyFrame, uint pts)
        {
            RealStreamTime = DateTime.Now;

            if (dataLen == 0)
            {
                return;
            }
            try
            {

                if (mediaType == 0)
                {
                    var mf = new MediaFrame()
                    {
                        nWidth = 1080,
                        nHeight = 720,
                        nEx = 1,
                        nIsAudio = 0,
                        nEncoder = MediaFrame.H264Encoder,
                        nIsKeyFrame = (byte)(isKeyFrame),
                        MediaFrameVersion = 0,
                        nPPSLen = 0,
                        nSPSLen = 0,
                        Data = data,
                        nSize = data.Length,
                        nTimetick = Environment.TickCount,
                    };

                    if (mf.nIsKeyFrame == 1)
                    {
                        var sps_pps = MediaSteamConverter.GetSPS_PPS(data);
                        mf.nSPSLen = (short)sps_pps[0].Length;
                        mf.nPPSLen = (short)sps_pps[1].Length;
                    }
                    mf.MediaFrameVersion = mf.nIsKeyFrame;
				//播放音视频
                    _mp.Play(mf);
                    //packet = new MediaFramePacket(data, Nvr.Core.Adapter.MediaType.VideoES, pts, 0, Convert.ToByte(isKeyFrame), 0, 0);
                }
                else
                {



                    var mf = new MediaFrame()
                    {
                        nFrequency = param.Frequency,
                        nSamples = (short)1024 * 2,
                        nIsKeyFrame = (byte)((_audioFrameIndex++ % 50) == 0 ? 1 : 0),
                        nEncoder = aCfg.encoder,
                        MediaFrameVersion = 0,
                        nChannel = 1,
                        nAudioFormat = 2,
                        nIsAudio = 1,
                        nTimetick = Environment.TickCount,
                        nEx = 1,
                        Data = data,
                        nSize = data.Length,
                    };

                    mf.MediaFrameVersion = (byte)(mf.nIsKeyFrame == 1 ? 1 : 0);
                    mf.nEx = (byte)(mf.nIsKeyFrame == 1 ? 0 : 1);

                    //if (_isFirstKeyFrame)
                    //{
                    // _isFirstKeyFrame = false;
                    // var resetCodecMediaFrame = CreateResetCodecMediaFrame(mf);
                    // if (_callBack != null)
                    // _callBack(resetCodecMediaFrame);
                    //}

                    //if (_callBack != null)
                    // _callBack(mf);

                    mf.MediaFrameVersion = mf.nIsKeyFrame;

                    _mp.Play(mf);
                    // Console.WriteLine("收到声音");
                }


            }
            catch (Exception ex)
            {
                // Main.PrintMessage("Dahua->ClientReadDataCallBack:" + ex.Message);
            }
        }

操作流程

1、启动Rtmp
2、等待Rtmp启动完成点击获取流按钮

遗留问题

项目目前对音频支持不好,音频播放我测试是卡顿的。后续会继续优化。

未来计划

1、优化音频
2、使用UDP转发音视频流包括乱序重拍、流控、丢包补偿(nack和Fec)

项目说明

未来开发的服务主要针对以下几个方向:
1、监控SDK方向
2、视频传输SDK
3、视频会议方向

项目下载地址

https://download.csdn.net/download/qq_20504373/12742048

欢迎留言交流

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服