【SZU计算机网络实验】实现流式视频传输

前言

一百年没有更新博客了,都怪开学一堆杂活(x

那就顺手把实验报告转到这边吧owo

本实验为SZU原创实验,实验开发团队的老师和助教们都很有耐心。。大赞,环境没配好去群里问是秒回的

相关资料:

实验文档:计算机网络课程综合实验平台 (snrc.site)

一、实验介绍

该实验主要实现了一个服务端和一个客户端。其中,服务端利用缓冲区逐段向客户端发送多个视频片段,并在客户端逐段接收,并利用已经设计好的播放器,在网页中播放连续的视频。

二、实验过程

0. 环境搭建

实验文件中包含了压缩包exp1-lib.zip,exp-code.zip,cne.zip

将其解压,并把前两个压缩包(exp1-lib.zip和exp-code.zip)解压后的文件置于一个目录下,于cne.zip解压出来的文件夹devcpp6中的devcppPortable.exe中打开client.c和server.c文件,选择编译环境为Computer-networks

image.png

1. 单文件视频传输

阅读代码发现实验文件中已经实现了:

1)服务端的初始化阶段,包括创建套接字,绑定套接字和监听套接字,以及接收客户端下载请求和发送文件大小给客户端,发送文件结束符和关闭文件。

2)客户端的初始化阶段,向服务器请求文件并接受文件的大小,检查文件结束符后将接收到的视频写入文件中

我们需要实现的是:

1)在服务端:

将文件的内容循环读取到缓冲区中,再将缓冲区的内容发送给客户端,注意读到文件末尾可能无法完整填充整个缓冲区,需要做特判

        // 发送视频片段int send_count = 0;while (send_count < file_size){/***************************************************************************************************//**************************  任务1: 发送指定视频文件(按照固定大小buffer方式) ********************//***************************************************************************************************/char buffer[BUFFER_SIZE] = {0};int bytes_read = (send_count + BUFFER_SIZE <= file_size) ? BUFFER_SIZE : file_size - send_count;fread(buffer, bytes_read, 1, fp);bytes_sent = send(new_socket, buffer, bytes_read, 0);if (bytes_sent < 0)printf("ERROR in send video\n");send_count += bytes_sent;printf("video send progress: %d / %d\n", send_count, file_size);}

2)在客户端:

接收服务端发送的数据并写入文件。文件末尾无法完整填充缓冲区的处理方式同服务端

	    int recv_count = 0;while (recv_count < file_size){		/************************************************************************//***************** 任务3 : 如何使用buffer接收视频文件?*****************//************************************************************************/bytes_recv = (recv_count + BUFFER_SIZE <= file_size) ? BUFFER_SIZE : file_size - recv_count;bytes_recv = recv(sock, video_segement + recv_count, bytes_recv, 0);recv_count += bytes_recv;printf("%s recv progress: %d / %d\n", req, recv_count, file_size);}    

2. 实现流式视频传输

实现流式视频传输要求我们在客户端请求同一个视频的多个视频段,那就利用sprintf将指定视频名(包括视频名称-视频分辨率-视频码率)与视频段序号拼接在一起,在客户端循环请求并接收,在服务端循环发送。最后再在客户端调用player.h中设计好的函数,在网页中播放视频

在客户端:

调用StartStreamingServer() 初始化播放器等资源,在循环中利用sprintf构造请求的文件名

	StartStreamingServer();for (int id = 0;id < 60; ++id){// 发送下载请求int bytes_sent = 0;unsigned char s_stop_byte = 0xFF;// 视频文件名char req[REQUEST_SIZE] = "";/******************************************************************//***************** 任务2:如何按顺序选择视频文件?*****************//******************************************************************/sprintf(req, "ocean-1080p-8000k-%d.ts", id);bytes_sent = send(sock, req, REQUEST_SIZE, 0);if (bytes_sent < 0)printf("ERROR in send\n");bytes_sent = send(sock, &s_stop_byte, sizeof(s_stop_byte), 0);if (bytes_sent < 0)printf("ERROR in send\n");printf("send req: %s\n", req);

接收完成时调用ReceiveSegment()将完整的视频段交付给播放器,等待播放
在结束阶段调用WaitEnd()等待视频播放完毕后关闭播放器

	    /***数据接收完成阶段***/ReceiveSegment(video_segement, req, file_size);// 释放内存free(video_segement);    video_segement = NULL;}	/*************************************************************************************//*********任务2(扩展):如何在视频流传输完成后,通知server结束视频传输?*************//*************************************************************************************//***结束阶段***/closesocket(sock);WSACleanup();WaitEnd();}

三、实验结果

先编译运行server.c,服务端启动监听,如下

Create Server Socket Success.
Server Bind Port Success.
Server Listening.....

后编译运行client.c,开始依次传输视频文件

ocean-1080p-8000k-59.ts recv progress: 178176 / 181608
ocean-1080p-8000k-59.ts recv progress: 179200 / 181608
ocean-1080p-8000k-59.ts recv progress: 180224 / 181608
ocean-1080p-8000k-59.ts recv progress: 181248 / *181608*
ocean-1080p-8000k-59.ts recv progress: 181608 / 181608
file_path .\download\ocean-1080p-8000k-59.ts

网页播放视频如下:

image.png

帅帅帅

(其实还有思考题,找时间再研究下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/756760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s详细教程

Kubernetes详细教程 1. Kubernetes介绍 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点…

JavaScript高级(十八)---进程和线程,宏任务和微任务

进程和线程 进程&#xff08;process&#xff09;&#xff1a;计算机已经运行的程序&#xff0c;是操作系统管理程序的一种方式&#xff0c;我们可以认为&#xff0c;启动一个应用程序&#xff0c;就会默认启动一个进程&#xff08;也可能是多个进程&#xff09;。 线程&…

行业模板|DataEase制造行业大屏模板推荐

DataEase开源数据可视化分析平台于2022年6月发布模板市场&#xff08;https://templates-de.fit2cloud.com&#xff09;&#xff0c;并于2024年1月新增适用于DataEase v2版本的模板分类。模板市场旨在为DataEase用户提供专业、美观、拿来即用的大屏模板&#xff0c;方便用户根据…

智能合约 之 ERC-721

ERC-721&#xff08;Non-Fungible Token&#xff0c;NFT&#xff09;标准 ERC-721是以太坊区块链上的一种代币标准&#xff0c;它定义了一种非同质化代币&#xff08;Non-Fungible Token&#xff0c;NFT&#xff09;的标准。NFT是一种加密数字资产&#xff0c;每个代币都具有独…

【计算机网络_网络层】IP协议

文章目录 1. IP的基本概念1.1 什么是IP协议1.2 为什么要有IP协议 2. IP的协议格式3. 网段划分&#xff08;重要&#xff09;3.1 为什么要进行网段划分3.2 网段划分的规则3.2.1 古老的划分方案3.2.2 现代的划分方案 4. 特殊的IP地址5. 解决IP地址的数量限制问题6. 私有IP和公网I…

深入浅出Reactor和Proactor模式

Reactor模式和Proactor模式是两种常见的设计模式&#xff0c;用于处理事件驱动的并发编程。它们在处理IO操作时有着不同的工作方式和特点。 对于到来的IO事件&#xff08;或是其他的信号/定时事件&#xff09;&#xff0c;又有两种事件处理模式&#xff1a; Reactor模式&…

HarmonyOS NEXT应用开发之元素超出List区域

介绍 本示例介绍在List组件内实现子组件超出容器边缘的布局样式的实现方法。 List组件clip属性默认为true&#xff0c;超出容器边缘的子组件会按照List的布局范围被裁剪。为此&#xff0c;可以在List组件内部添加一个占位的ListItem&#xff0c;以达到预期的布局效果。List占…

【项目实践Day06】异步请求与同步请求+Ajax+微信小程序上实现发送异步请求

什么是同步和异步 同步 在主线程上排队执行的任务&#xff0c;只有前一个任务执行完毕&#xff0c;才能继续执行下一个任务。也就是一旦调用开始&#xff0c;就必须等待其返回结果&#xff0c;程序的执行顺序和任务排列顺序一致。客户端必须等待服务器端的响应。在等待的期间客…

HTML静态网页成品作业(HTML+CSS)——宠物狗店网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

NVIDIA NIM 提供优化的推理微服务以大规模部署 AI 模型

NVIDIA NIM 提供优化的推理微服务以大规模部署 AI 模型 生成式人工智能的采用率显着上升。 在 2022 年 OpenAI ChatGPT 推出的推动下&#xff0c;这项新技术在几个月内就积累了超过 1 亿用户&#xff0c;并推动了几乎所有行业的开发活动激增。 到 2023 年&#xff0c;开发人员…

Covalent Network(CQT)借助最大规模的历史与实时 Web3 数据集,推动人工智能的发展

人工智能在众多领域中增强了区块链的实用性&#xff0c;反之亦然&#xff0c;区块链确保了 AI 模型所使用的数据的来源和质量。人工智能带来的生产力提升&#xff0c;将与区块链系统固有的安全性和透明度融合。 Covalent Network&#xff08;CQT&#xff09;正位于这两项互补技…

HarmonyOS NEXT应用开发之Navigation实现多设备适配案例

介绍 在应用开发时&#xff0c;一个应用需要适配多终端的设备&#xff0c;使用Navigation的mode属性来实现一套代码&#xff0c;多终端适配。 效果图预览 使用说明 将程序运行在折叠屏手机或者平板上观看适配效果。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a…

backtrader回测股票:突破20日均线买入,跌破20日均线卖出

数据源&#xff1a;akshare 回测工具&#xff1a;backtrader 策略&#xff1a;突破20日均线买入&#xff0c;跌破20日均线卖出 代码&#xff1a; from datetime import datetime import backtrader as bt #1.9.78.123 import matplotlib.pyplot as plt #3.8.3 import aks…

数据库只追求性能是不够的!

那些成功的数据库公司没有一家是通过性能比竞争对手更快而成功的。 作者&#xff1a;JORDAN TIGANI&#xff0c;DuckDB 公司 MotherDuck 联合创始人&CEO 本文和封面来源&#xff1a;https://motherduck.com/&#xff0c;爱可生开源社区翻译。 本文约 4500 字&#xff0c;预…

论文阅读之AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE

文章目录 原文链接主要内容模型图技术细节实验结果 原文链接 AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 主要内容 这篇文章的主要内容是介绍了一种新的计算机视觉模型——Vision Transformer&#xff08;ViT&#xff09;&#xff0c;这是…

自然语言处理学习总结

目录 1、词表示 2、语言模型&#xff08;LM&#xff09; 3、常用学习网址 自然语言处理 1、词表示 词表示&#xff1a;自然语言中最基本的语言单位表示成机器理解的方式 方式一&#xff1a;词与词之间的相似度 方式二&#xff1a;词与词之间的关系 词义的表示方法&…

云手机在海外电商中的应用优势

随着海外市场的不断拓展&#xff0c;电商行业对于高效、安全的工具需求日益增长。在这一背景下&#xff0c;云手机作为一种新型服务&#xff0c;为海外电商提供了强大的支持和便利。云手机对传统物理手机起到了非常好的延展和补充作用&#xff0c;拓展了更广泛的应用场景&#…

RabbitMQ问题

如何实现顺序消费&#xff1f; 消息放入到同一个队列中消费 如何解决消息不丢失&#xff1f; 方案&#xff1a; 如上图&#xff1a;消息丢失有三种情况&#xff0c;解决了以上三种情况就解决了丢失的问题 1、丢失1--->消息在到达交换机的时候&#xff1b;解决&#xff1…

原生html vue3使用element plus 的树tree上移下移案例源码

上效果 html源码 <!DOCTYPE html> <html lang"en"> <!-- * Name: mallSalesReports.html * Description: * Author Lani * date 2024-02-28 18:32:36 --> <head><meta charset"UTF-8"><meta name"viewport" …

docker入门(五)—— 小练习,docker安装nginx、elasticsearch

练习 docker 安装 nginx # 搜素镜像 [rootiZbp15293q8kgzhur7n6kvZ home]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx …