郑州春蕾网站建设电信公司网络维护
- 作者: 五速梦信息网
- 时间: 2026年04月20日 03:43
当前位置: 首页 > news >正文
郑州春蕾网站建设,电信公司网络维护,网站建设及推广服务公司,知名网站服务器一、前言 上次实现的文件推流#xff0c;尽管优点很多#xff0c;但是只能对现在存在的生成好的音视频文件推流#xff0c;而现在更多的场景是需要将实时的视频流重新推流分发#xff0c;用户在很多设备比如手机/平板/网页/电脑/服务器上观看#xff0c;这样就可以很方便…一、前言 上次实现的文件推流尽管优点很多但是只能对现在存在的生成好的音视频文件推流而现在更多的场景是需要将实时的视频流重新推流分发用户在很多设备比如手机/平板/网页/电脑/服务器上观看这样就可以很方便的将分散的视频流统一集中的流媒体服务器上然后统一对外分发视频而不是全部从设备端取流大大减轻了设备端的压力流媒体服务器就专门干这个事情负责分发功能单一不容易出错支持的并发数量很高。除了能够对网络摄像头的实时视频流转发还可以将电脑桌面/本地摄像头实时视频推流出去类似的技术主要应用在各类教育直播、在线会议、视频监控领域。 推拉流一般涉及到三个程序要素推流程序比如ffmpeg拉流程序比如ffplay或各种播放器流媒体服务程序比如mediamtx原rtsp-simple-server、srs、EasyDarwin、LiveQing、ZLMediaKit刚开始做推流开发都会有个疑问以为只要有推流拉流就可以玩起来其实都需要有个专门的流媒体服务程序做接收流并分发其实ffmpeg全家桶以前还自带个ffserver就是流媒体服务程序后面可能因为不是主业逐渐去掉了这个。个人推荐用mediamtxgo写的单文件支持windows、linux、mac三大操作系统亲测全部好用。如果需要有管理的后台那就推荐LiveQing。 二、效果图 三、体验地址 国内站点https://gitee.com/feiyangqingyun国际站点https://github.com/feiyangqingyun个人作品https://blog.csdn.net/feiyangqingyun/article/details/97565652体验地址https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码01jf 文件名bin_video_push。 四、相关代码 bool FFmpegSave::initVideoMp4() {//必须先设置过输入视频流if (!videoStreamIn || fileName.isEmpty()) {return false;}AVDictionary *options NULL;QByteArray fileData fileName.toUtf8();const char *url fileData.data();//既可以是保存到文件也可以是推流(对应格式要区分)const char *format mp4;if (fileName.startsWith(rtmp)) {format flv;} else if (fileName.startsWith(rtsp)) {format rtp;av_dict_set(options, stimeout, 3000000, 0);av_dict_set(options, rtsp_transport, tcp, 0);//如果前缀是rtsp需要强制改成rtp否则报错提示 Protocol not foundQString temp fileName.replace(rtsp://, rtp://);url temp.toUtf8().data();}//开辟一个格式上下文用来处理视频流输出int result avformat_alloc_output_context2(formatCtx, NULL, format, url);if (result 0) {debug(创建格式, QString(错误: %1).arg(FFmpegHelper::getError(result)));return false;}//创建视频流用来输出视频数据到文件videoStreamOut avformat_new_stream(formatCtx, NULL);result FFmpegHelper::copyContext(videoCodecCtx, videoStreamOut, true);if (result 0) {debug(创建视频, QString(错误: %1).arg(FFmpegHelper::getError(result)));goto end;}//打开输出文件result avio_open(formatCtx-pb, url, AVIO_FLAG_WRITE);if (result 0) {debug(打开输出, QString(错误: %1).arg(FFmpegHelper::getError(result)));goto end;}//写入文件开始符result avformat_write_header(formatCtx, options);if (result 0) {debug(写入失败, QString(错误: %1).arg(FFmpegHelper::getError(result)));goto end;}return true;end://关闭释放并清理文件this-close();this-deleteFile(fileName);return false; }void FFmpegPushClient::start() {if (ffmpegThread || videoUrl.isEmpty()) {return;}//实例化视频采集线程ffmpegThread new FFmpegThread;//关联播放开始信号用来启动推流connect(ffmpegThread, SIGNAL(receivePlayStart(int)), this, SLOT(receivePlayStart(int)));//收到一帧数据用于保存文件connect(ffmpegThread, SIGNAL(receivePacket(AVPacket *)), this, SLOT(receivePacket(AVPacket *)));//关联录制信号变化用来判断是否推流成功connect(ffmpegThread, SIGNAL(recorderStateChanged(RecorderState, QString)), this, SLOT(recorderStateChanged(RecorderState, QString)));//设置播放地址ffmpegThread-setVideoUrl(videoUrl);//设置硬件加速ffmpegThread-setHardware(hardware);//设置解码内核ffmpegThread-setVideoCore(VideoCore_FFmpeg);//设置视频模式ffmpegThread-setVideoMode(VideoMode_Opengl);//设置读取超时时间超时后会自动重连ffmpegThread-setReadTimeout(5 * 1000);//设置连接超时时间(0表示一直连)ffmpegThread-setConnectTimeout(0);//设置重复播放相当于循环推流ffmpegThread-setPlayRepeat(true);//设置解码线程仅仅用作推流ffmpegThread-setOnlyPush(true);ffmpegThread-setPushAndSave(!fileName.isEmpty());//设置音视频保存类型ffmpegThread-setSaveAudioType(SaveAudioType_None);ffmpegThread-setSaveVideoType(SaveVideoType_Mp4);//如果是本地设备或者桌面录屏要取出其他参数VideoType videoType VideoHelper::getVideoType(videoUrl);if (videoType VideoType_Camera || videoType VideoType_Desktop) {QString deviceName videoUrl;QString resolution 0x0;int frameRate, offsetX, offsetY;//如果地址带了摄像头参数或者桌面参数则需要取出对应的参数if (videoType VideoType_Camera) {VideoHelper::getCameraPara(VideoCore_FFmpeg, deviceName, resolution, frameRate);} else if (videoType VideoType_Desktop) {VideoHelper::getDesktopPara(VideoCore_FFmpeg, deviceName, resolution, frameRate, offsetX, offsetY);}ffmpegThread-setVideoUrl(deviceName);ffmpegThread-setBufferSize(resolution);ffmpegThread-setFrameRate(frameRate);ffmpegThread-setProperty(offsetX, offsetX);ffmpegThread-setProperty(offsetY, offsetY);}ffmpegThread-play(); }void FFmpegPushClient::stop() {//停止推流和采集并彻底释放对象if (ffmpegThread) {ffmpegThread-recordStop();ffmpegThread-stop();ffmpegThread-deleteLater();ffmpegThread NULL;}//停止录制if (ffmpegSave) {ffmpegSave-stop();ffmpegSave-deleteLater();ffmpegSave NULL;} }五、功能特点 5.1 文件推流 指定网卡和监听端口接收网络请求推送音视频等各种文件。实时统计显示每个文件对应的访问数量、总访问数量、不同IP地址访问数量。可指定多种模式0-直接播放、1-下载播放。实时打印显示各种收发请求和应答数据。每个文件对应MD5加密的唯一标识符用于请求地址后缀区分访问哪个文件。支持各种浏览器谷歌chromium/微软edge/火狐firefox等、各种播放器vlc/mpv/ffplay/potplayer/mpchc等打开请求。播放过程中可以任意切换播放进度支持倍速播放。需要推流的文件名称历史记录自动存储和打开加载应用。切换文件获取访问地址自动拷贝地址到剪切板方便直接粘贴测试使用。极低CPU占用128路1080P同时推流不到1%CPU占用异步发送数据机制。纯QTcpSocket通信不依赖流媒体服务程序核心源码不到500行注释详细功能完整。支持Qt4/Qt5/Qt6任意版本支持任意系统windows/linux/macos/android/嵌入式linux等。 5.2 网络推流 支持各种本地视频文件和网络视频文件。支持各种网络视频流网络摄像头协议包括rtsp、rtmp、http。支持将本地摄像头设备推流可指定分辨率和帧率等。支持将本地桌面推流可指定屏幕区域和帧率等。自动启动流媒体服务程序默认mediamtx原rtsp-simple-server可选用srs、EasyDarwin、LiveQing、ZLMediaKit等。可实时切换预览视频文件。推流的清晰度和质量可调。可动态添加文件、目录、地址。视频文件自动循环推流如果视频源是视频流在掉线后会自动重连。网络视频流自动重连重连成功自动继续推流。网络视频流实时性极高延迟极低延迟时间大概在100ms左右。推流后除了用rtmp地址访问以外还支持直接hls/webrtc访问可以直接浏览器打开看实时画面。支持Qt4/Qt5/Qt6任意版本支持任意系统windows/linux/macos/android/嵌入式linux等。
- 上一篇: 郑州php网站开发培训有什么外贸网站
- 下一篇: 郑州代理记账网站建设汇云网站建设
相关文章
-
郑州php网站开发培训有什么外贸网站
郑州php网站开发培训有什么外贸网站
- 技术栈
- 2026年04月20日
-
郑州 网站建设 东区广告发布税率
郑州 网站建设 东区广告发布税率
- 技术栈
- 2026年04月20日
-
郑州 网站 公司网站管理系统是什么
郑州 网站 公司网站管理系统是什么
- 技术栈
- 2026年04月20日
-
郑州代理记账网站建设汇云网站建设
郑州代理记账网站建设汇云网站建设
- 技术栈
- 2026年04月20日
-
郑州的网站建设中国建设厅官方网站
郑州的网站建设中国建设厅官方网站
- 技术栈
- 2026年04月20日
-
郑州定制网站百度推广怎么收费标准案例
郑州定制网站百度推广怎么收费标准案例
- 技术栈
- 2026年04月20日






