gopro一分钟4k视频大小11g左右go语言计算一个视频大小 , 4k视频对内存卡要求主要二点:读写速度快和内存大
4K视频需要满足读写速度90MB/s是最低标准 。
扩展go语言计算一个视频大?。喝绾窝」鹤愎坏哪诖婵?
目前最大容量的又满足配置要求的内存卡是:闪迪Extrme PRO SDXC UHS-I存储卡
闪迪Extrme PRO SDXC UHS-I存储卡
该容量达到了史无前例的512GBgo语言计算一个视频大小,官方零售价格折合人民币达到了将近5000元人民币.
该产品符合最新的SDXC存储卡技术标准 , 物理推个包含了标准SDXC标准格式(32×24×2.1毫米),UHS-I传输介面,理论最高带宽传输速率104MB/s,实际上可以达到读取95MB/s、写入90MB/s 。
gopro4k120帧视频一分钟有多大2.97GB 。根据查询gopro相关资料显示,gopro4k120帧视频一分钟有2.97GB 。一张256GB的SD卡可以录制大约86分钟,512GB的SD卡可以录制大约172.5分钟 。gopro是美国运动相机厂商 。gopro的相机现已被冲浪、滑雪、极限自行车及跳伞等极限运动团体广泛运用,因而“gopro”也几乎成为“极限运动专用相机”的代名词 。
Go语言中恰到好处的内存对齐 在开始之前,希望你计算一下Part1共占用的大小是多少呢?
输出结果:
这么一算,Part1这一个结构体的占用内存大小为 1 4 1 8 1 = 15 个字节 。相信有的小伙伴是这么算的,看上去也没什么毛病
真实情况是怎么样的呢?我们实际调用看看,如下:
输出结果:
最终输出为占用 32 个字节 。这与前面所预期的结果完全不一样 。这充分地说明了先前的计算方式是错误的 。为什么呢?
在这里要提到 “内存对齐” 这一概念,才能够用正确的姿势去计算,接下来我们详细的讲讲它是什么
有的小伙伴可能会认为内存读取 , 就是一个简单的字节数组摆放
上图表示一个坑一个萝卜的内存读取方式 。但实际上 CPU 并不会以一个一个字节去读取和写入内存 。相反 CPU 读取内存是 一块一块读取 的,块的大小可以为 2、4、6、8、16 字节等大小 。块大小我们称其为 内存访问粒度。如下图:
在样例中,假设访问粒度为 4 。CPU 是以每 4 个字节大小的访问粒度去读取和写入内存的 。这才是正确的姿势
另外作为一个工程师,你也很有必要学习这块知识点哦 :)
在上图中,假设从 Index 1 开始读取,将会出现很崩溃的问题 。因为它的内存访问边界是不对齐的 。因此 CPU 会做一些额外的处理工作 。如下:
从上述流程可得出,不做 “内存对齐” 是一件有点 "麻烦" 的事 。因为它会增加许多耗费时间的动作
而假设做了内存对齐,从 Index 0 开始读取 4 个字节,只需要读取一次,也不需要额外的运算 。这显然高效很多,是标准的 空间换时间 做法
在不同平台上的编译器都有自己默认的 “对齐系数” , 可通过预编译命令#pragma pack(n)进行变更,n 就是代指 “对齐系数” 。一般来讲 , 我们常用的平台的系数如下:
另外要注意,不同硬件平台占用的大小和对齐值都可能是不一样的 。因此本文的值不是唯一的,调试的时候需按本机的实际情况考虑
输出结果:
在 Go 中可以调用unsafe.Alignof来返回相应类型的对齐系数 。通过观察输出结果 , 可得知基本都是2^n ,最大也不会超过 8 。这是因为我手提(64 位)编译器默认对齐系数是 8,因此最大值不会超过这个数
在上小节中,提到了结构体中的成员变量要做字节对齐 。那么想当然身为最终结果的结构体 , 也是需要做字节对齐的
接下来我们一起分析一下 , “它” 到底经历了些什么,影响了 “预期” 结果
在每个成员变量进行对齐后,根据规则 2,整个结构体本身也要进行字节对齐 , 因为可发现它可能并不是2^n ,不是偶数倍 。显然不符合对齐的规则
根据规则 2,可得出对齐值为 8 。现在的偏移量为 25,不是 8 的整倍数 。因此确定偏移量为 32 。对结构体进行对齐
Part1 内存布局:axxx|bbbb|cxxx|xxxx|dddd|dddd|exxx|xxxx
通过本节的分析 , 可得知先前的 “推算” 为什么错误?
是因为实际内存管理并非 “一个萝卜一个坑” 的思想 。而是一块一块 。通过空间换时间(效率)的思想来完成这块读取、写入 。另外也需要兼顾不同平台的内存操作情况
在上一小节,可得知根据成员变量的类型不同,其结构体的内存会产生对齐等动作 。那假设字段顺序不同 , 会不会有什么变化呢?我们一起来试试吧 :-)
输出结果:
通过结果可以惊喜的发现,只是 “简单” 对成员变量的字段顺序进行改变,就改变了结构体占用大小
接下来我们一起剖析一下Part2 , 看看它的内部到底和上一位之间有什么区别 , 才导致了这样的结果?
符合规则 2,不需要额外对齐
Part2 内存布局:ecax|bbbb|dddd|dddd
通过对比Part1和Part2的内存布局,你会发现两者有很大的不同 。如下:
仔细一看,Part1存在许多 Padding 。显然它占据了不少空间,那么 Padding 是怎么出现的呢?
通过本文的介绍,可得知是由于不同类型导致需要进行字节对齐,以此保证内存的访问边界
那么也不难理解,为什么 调整结构体内成员变量的字段顺序 就能达到缩小结构体占用大小的疑问了,是因为巧妙地减少了 Padding 的存在 。让它们更 “紧凑” 了 。这一点对于加深 Go 的内存布局印象和大对象的优化非常有帮
Go 语言自我提升 (三次握手 - 四次挥手 - TCP状态图 - udp - 网络文件传输)三次握手:
1. 主动发起连接请求端(客户端),发送 SYN 标志位,携带数据包、包号
2. 被动接收连接请求端(服务器),接收 SYN,回复 ACK,携带应答序列号 。同时 , 发送SYN标志位,携带数据包、包号
3. 主动发起连接请求端(客户端) , 接收SYN 标志位 , 回复 ACK 。
被动端(服务器)接收 ACK —— 标志着 三次握手建立完成( Accept()/Dial() 返回 )
四次挥手:
1. 主动请求断开连接端(客户端),发送 FIN标志,携带数据包
2. 被动接受断开连接端(服务器) , 发送 ACK标志,携带应答序列号 。—— 半关闭完成 。
3. 被动接受断开连接端(服务器), 发送 FIN标志,携带数据包
4. 主动请求断开连接端(客户端),发送 最后一个 ACK标志,携带应答序列号 。—— 发送完成 , 客户端不会直接退出,等 2MSL时长 。
等 2MSL待目的:确保服务器 收到最后一个ACK
滑动窗口:
通知对端本地存储数据的 缓冲区容量 。—— write 函数在对端 缓冲区满时,有可能阻塞 。
TCP状态转换:
1. 主动发起连接请求端:
CLOSED —— 发送SYN —— SYN_SENT(了解) —— 接收ACK、SYN,回发 ACK —— ESTABLISHED (数据通信)
2. 主动关闭连接请求端:
ESTABLISHED —— 发送FIN —— FIN_WAIT_1 —— 接收ACK —— FIN_WAIT_2 (半关闭、主动端)
—— 接收FIN、回复ACK —— TIME_WAIT (主动端) —— 等 2MSL 时长 —— CLOSED
3. 被动建立连接请求端:
CLOSED —— LISTEN —— 接收SYN、发送ACK、SYN —— SYN_RCVD —— 接收 ACK —— ESTABLISHED (数据通信)
4. 被动断开连接请求端:
ESTABLISHED —— 接收 FIN、发送 ACK —— CLOSE_WAIT —— 发送 FIN —— LAST_ACK —— 接收ACK —— CLOSED
windows下查看TCP状态转换:
netstat -an | findstr端口号
Linux下查看TCP状态转换:
netstat -an | grep端口号
TCP和UDP对比:
TCP: 面向连接的可靠的数据包传递 。针对不稳定的 网络层 , 完全弥补 。ACK
UDP:无连接不可靠的报文传输 。针对不稳定的 网络层,完全不弥补 。还原网络真实状态 。
优点缺点
TCP:可靠、顺序、稳定系统资源消耗大,程序实现繁复、速度慢
UDP:系统资源消耗小,程序实现简单、速度快不可靠、无序、不稳定
使用场景:
TCP:大文件、可靠数据传输 。对数据的 稳定性、准确性、一致性要求较高的场合 。
UDP:应用于对数据时效性要求较高的场合 。网络直播、电话会议、视频直播、网络游戏 。
UDP-CS-Server实现流程:
1.创建 udp地址结构 ResolveUDPAddr(“协议”, “IP:port”) —— udpAddr 本质 struct{IP、port}
2.创建用于 数据通信的 socket ListenUDP(“协议”, udpAddr ) —— udpConn (socket)
3.从客户端读取数据 , 获取对端的地址 udpConn.ReadFromUDP() —— 返回:n , clientAddr,err
4.发送数据包给 客户端 udpConn.WriteToUDP("数据", clientAddr)
UDP-CS-Client实现流程:
1.创建用于通信的 socket 。net.Dial("udp", "服务器IP:port") —— udpConn (socket)
2.以后流程参见 TCP客户端实现源码 。
UDPserver默认就支持并发!
------------------------------------
命令行参数: 在main函数启动时 , 向整个程序传参 。【重点】
语法: go run xxx.goargv1 argv2argv3argv4。。。
xxx.exe:第 0 个参数 。
argv1 :第 1 个参数 。
argv2 :第 2 个参数 。
argv3 :第 3 个参数 。
argv4 :第 4 个参数 。
使用: list := os.Args提取所有命令行参数 。
获取文件属性函数:
os.stat(文件访问绝对路径) —— fileInfo 接口
fileInfo 包含 两个接口 。
Name() 获取文件名 。不带访问路径
Size() 获取文件大小 。
网络文件传输 —— 发送端(客户端)
1.获取命令行参数,得到文件名(带路径)filePathlist := os.Args
2.使用 os.stat() 获取 文件名(不带路径)fileName
3.创建 用于数据传输的 socketnet.Dial("tcp", “服务器IP port”) —— conn
4.发送文件名(不带路径)给接收端,conn.write()
5.读取 接收端回发“ok”,判断无误 。封装函数 sendFile(filePath, conn) 发送文件内容
6.实现 sendFile(filePath,conn)
1) 只读打开文件 os.Open(filePath)
for {
2) 从文件中读数据f.Read(buf)
3) 将读到的数据写到socket中conn.write(buf[:n])
4)判断读取文件的 结尾 。io.EOF. 跳出循环
}
网络文件传输 —— 接收端(服务器)
1. 创建用于监听的 socket net.Listen() —— listener
2. 借助listener 创建用于 通信的 socket listener.Accpet()—— conn
3. 读取 conn.read() 发送端的 文件名,保存至本地 。
4. 回发 “ok”应答 发送端 。
5. 封装函数,接收文件内容 recvFile(文件路径)
1) f = os.Create(带有路径的文件名)
for {
2)从 socket中读取发送端发送的 文件内容。conn.read(buf)
3)将读到的数据 保存至本地文件 f.Write(buf[:n])
4)判断 读取conn 结束,代表文件传输完成 。n == 0break
}
深入理解golang最近三年,在工作中使用go开发了不少服务 。深感go的便捷,以及它的runtime的复杂 。我觉得需要定期的进行总结,因此决定写这篇文章,也许更准确的 , 应该叫笔记 。
最近终于解决了一个和cgo有关的问题 。这个问题从发现到解决前后经历了接近4个月,当然 , 和人手不足也有关系 。而对于我个人而言,这个问题其实历时2年!这得从头说起 。
在上一家公司的一个项目里,有一个服务做音视频数据的提取,这个服务运行在嵌入式设备TX2上 。音视频提取这一关键功能主要利用nvidia基于gstreamer开发的插件,这个插件可以发挥nvidia gpu的硬件解码功能 。当时这个服务使用go和c混编的方式,问题的症状是服务运行一段时间后,不输出音视频数据 。遗憾的是 , 由于疫情,项目停止,因此没有机会继续研究这个问题 。
时间来到去年底 。当前这个项目进行压力测试,发现关键的语音处理服务运行一段时间后,会出现不拉流的情况,因此也没有后续的结果输出 。症状和上一个项目非常像 。虽然使用的第三方SDK不一样,但同样用了go和c混编的方式 。一开始,焦点就放在go的运行时上 , 觉得可能是go和c相互调用的方式不对 。经过合理猜测,并用测试进行验证后,发现问题还是在第三方拉流的SDK上,它们的回调函数必须要快,否则有可能会阻塞它们的回调线程 。当然 , 在go调用c的时候 , 如果耗时比较长 , 会对go的运行时造成一些副作用;在c回调go的时候,go的运行时也有可能阻塞c的回调线程 。但go的运行时已经比较成熟 , 因此我觉得它对这个问题的贡献不大 。以上采用了假设-验证的方法 , 主要的原因还是第三方的拉流SDK不开源 。在定位问题的过程中 , 使用了gdb的gcore来生成堆栈;也搭建了灰度环境来进行压力测试 , 以及完善监控 , 这些都是解决方法的一部分 。
正是这一问题 , 促使我更多的了解go的运行时 。而我看得越多,越觉得go的运行时是一个庞大的怪物 。因此,抱着能了解一点是一点的心态 , 不断的完善这篇笔记 。
用go 浏览器上网看一个25分钟的视频大概回要多少M 的流量??流量一般按电影的时间长度
清晰度(Q屏流量最多
高清晰一般
普通最低)
以25分钟影片计算
Q屏27M左右
高清晰20M左右
普通15M左右手机电视也有什么流畅版,清晰版还有Q屏吧,最耗流量的是Q屏版的 , 一小时要上百M,其他的一小时几十M,没有开通上网包月就不要用手机看电视,划不来的
答案补充
WAP上网一KB是3分钱 , 一分钟要1000KB--1500KB的样子不划算啊
【go语言计算一个视频大小 go语言计算一个视频大小怎么算】go语言计算一个视频大小的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于go语言计算一个视频大小怎么算、go语言计算一个视频大小的信息别忘了在本站进行查找喔 。
推荐阅读
- postgresql经典教程的简单介绍
- 做电商如何买空号,如何购买一个空号
- 可以联机的冒险游戏,有什么好玩的联机冒险游戏
- vb.net浮点数转换 vb浮点数转4字节
- gis矢量切片,arcgis切片xyz
- 南阳sap软件维护,erp软件维护
- c语言log函数替换 c语言log2函数实现
- mysql语句如何加入变量,mysql如何设置变量
- u盘怎么装xp系统,u盘怎么装电脑系统