首页 > 其他分享 >【SZU计算机网络实验】实现流式视频传输

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

时间:2024-03-19 23:35:13浏览次数:26  
标签:视频 文件 流式 计算机网络 send SZU recv 服务端 客户端

前言

一百年没有更新博客了,都怪开学一堆杂活(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

帅帅帅

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

标签:视频,文件,流式,计算机网络,send,SZU,recv,服务端,客户端
From: https://blog.csdn.net/andrew_1219/article/details/136858525

相关文章

  • 计算机网络实践学习 思科实验31:配置思科DHCP
    思科实验31:配置思科DHCP实验拓扑图实验目标实验步骤实验配置实验拓扑图实验目标配置思科设备作为DHCP服务器实验步骤配置OSPF路由协议配置R1为DHCP服务器配置DHCP中继,使得PC3可以获得地址全网通信测试实验配置1、配置R1为DHCP服务器,为本地网段分配地址R1(conf......
  • 电气防火限流式保护器在住宅区域的功能与配置是怎样的?
    袁媛ACRELYY安科瑞电气股份有限公司电气防火限流式保护器主要功能功能1.短路保护功能。保护器实时监测用电线路电流,当线路发生短路故障时,能在150微秒内实现快速限流保护,并发出声光报警信号。2.过载保护功能。当被保护线路的电流过载且过载持续时间超过动作时间(3~60秒可......
  • 在可燃性粉尘危险场所安装电气防火限流式保护器的必要性
    袁媛ACRELYY安科瑞电气股份有限公司1.概述所谓的可燃性粉尘环境,是指在大气环境的条件下,粉尘或纤维状的可燃性物质与空气的混合物点燃后,燃烧将传至全部未燃烧混合物的环境。随着现代工业技术的发展,可燃性粉尘的危险场所在不断增多,其危害变得不可避免,相应的粉尘爆炸事故也时......
  • 计算机网络的分类
    目录<计算机网络的分类>1.按网络覆盖范围分1)个人区域网PAN2)局域网3)城域网4)广域网5)互联网2.按传输介质分类3.按网络传输技术分类4.按网络的使用性质分类<计算机网络的分类>计算机网络分类的方法很多,可以从不同的角度观察网络系统、划分网络。根据不同的分......
  • 深入浅出计算机网络 day.3 第二章 物理层
    一定要把你在意的东西看得淡一点,再淡一点,有些事情有些人,只要你不那么在乎了,就不会伤害到你                                                         ......
  • 【计算机网络】传输层——传输层概念&UDP协议
    传输层概述主要学TCP和UDP协议,为应用层提供通信服务,使用网络层的服务只有主机才有的层次(路由器到网络层就没了)传输层功能1.提供进程与进程之间的通信2.复用和分用3.传输层对收到的报文进行差错检测。4.传输层的两种协议。TCPUDP差异面向连接的传输控制协议T......
  • 【计算机网络】网络层——ARP DHCP ICMP三大协议
    数据发送的过程同一局域网内(一号到三号)应用层是pdf到传输层把它分成一个个报文网络层,就拿报文段1距离,给他加上IP1(源地址)和IP3(目的地址)到数据链路层,就加前后缀。后缀中要增加MAC地址。MAC1是自己的地址,MAC3是目的地址一般会应用ARP高速缓存中IP地址和MAC地址的映射来获......
  • 【计算机网络】网络层——子网划分,子网掩码,CIDR(无分组编址)
    分类的IP地址的弱点:1.IP地址空间的利用率有时很低。2.两级IP地址不够灵活。子网划分某单位划分子网后,对外仍表现为一个网络,即本单位外的网络看不见本单位内子网的划分。子网号能否全0全1要看情况主机号不能全0全1划分了三个字网的情况子网掩码两级IP地址1的位数取决......
  • 【计算机网络】网络层——IPv6
    为什么要有IPv6虽然32位IPv4地址空间的消耗,使用CIDR(无分组编址)和NAT(网络地址转换、应用在局域网与外部网络之间)延缓了一点但是治标不质本IPv6从 根本上解决(增加地址位数)Qos(QualityofService,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力......
  • 【计算机网络】网络层——RIP OSPF BGP:路由选择协议
    路由选择协议回顾RIP小,OSPF大网RIP路由信息协议RIP是一种分布式的基于距离向量的路由选择协议,是因特网的协议标准,最大优点是简单。RIP协议要求网络中每一个路由器都维护从它自己到其他每一个目的网络的唯一最佳距离记录(即一组距离)。距离:通常为“跳数”,即从源端口到目......