需求:
- 需要指定大小的 视频/图片 文件(如300M、299.9M、300.1M)
- 上传后还可以进行预览,查看视频内容,可以拖拉进度条,检查视频内容是否受损
存储单位转换:计算机中常见的单位及转换
一、生成指定大小的文件
这个网络的资源比较多,主要方法有以下几种
1、fsutil命令(Windows)
# fsutil file createnew 文件名(带路径) 文件大小(byte)
# 例如:创建一个100M大小的.zip文件
# 100M = 1024字节 * 1024 * 100
fsutil file createnew D:\test.zip
2、mkfile命令(Mac)
# mkfile -n size[b|k|m|g] file_name
# 创建一个100M的.zip文件
mkfile -n 100m test.zip
3、dd命令(通用)
# dd命令需要定义 文件名,区块尺寸和区块大小
# dd if=/dev/zero of=filename bs=1024 count=1000
- if 输入文件
- of 输出文件
- bs 字节为单位的块大小
- count 被复制的块数
- /dev/zero 是一个字符设备,不断的返回0值字节
# bs的默认单位是byte,即b,也可以指定为 bs=1M
# 在当前目录下会生成一个1000M的test文件
# 文件内容为全0(因从/dev/zero中读取,/dev/zero为0源)
# 但是这样为实际写入硬盘,文件产生速度取决于硬盘读写速度
# 如果欲产生超大文件,速度很慢。
# 在/test目录生成一个大小为1G的大文件,内容是0
dd if=/dev/zero of=/test count=2 bs=512M
二、生成指定大小的视频
预先环境配置:Mac如何配置FFmpeg环境
通过第一部分我们知道如何生成一个指定大小的文件,我们自然可以通过上述方式更改一下后缀名,将其变成一个视频或其他任何类型文件。
但是我们的目的是希望创建出来的视频文件还可以进行播放和预览,如果有音频内容就更好了,便于我们进行第二步测试时候,播放、操作进度条及校验清晰度等。
那我们需要了解视频大小由什么参数决定。
视频大小计算公式:总码率(音频码率+视频码率) * 时长 / 8 = 视频时长(kb)
码率(常用单位kbps):每秒有多少数据 1Mbps=1024Kbps=1024/8KBps=128KB/s
了解这个基本就可以开工了,我们的目标就是如何修改一个已知视频的码率,通过搜索发现视频相关的概念太多,我们目标只解决问题,不讨论视频内部的各种概念
我们可以拿到指定大小的视频,最简单的方式就是裁剪,根据公式,我们按需要从一个大视频中裁剪指定的长度,就可以获取对应大小的视频
我们如果想拿到一个200M的视频大小如何操作呢?
# 首先第一步从得物下载一个视频,test1video的大小是5.2M,
# 也就是说,我们想拿到300M的视频,得先让这个视频拼接起来
import os
# 获取视频的大小byte
file_byte = os.path.getsize("/Users/admin/Downloads/test/test1video.mp4") # 5159526
# 这个视频离我们目标有点远,需要进行视频长度拼接,保持视频的其他参数不变
tar_size = 1024 * 1024 * 300 # 300M
count = (int)(tar_size/file_byte) + 1
print(count)
# 生成一个file_list.txt文件,填入指定内容
file = open('/Users/admin/Downloads/test/file_list.txt','w+')
while count > 0:
if count != 1:
file.write("file 'test1video.mp4'\n")
else:
file.write("file 'test1video.mp4'")
count -= 1
file.close()
通过上边的程序我们可以得到一个文件,file_list.txt,里边包含了指定个数的文件名
使用FFmpeg合并这些相同的视频
# 需要先添加FFmpeg相关可执行文件,并且配置环境变量
ffmpeg -f concat -i file_list.txt -c copy file_list.mp4
可以发现根据粗略计算出来的,结果变大了,这是因为合并的算法导致,我们进行略调整,目测减少两个,也就是59个试一下
还是大了一点,再减少一个,使用58个进行合并
可以发现已经小于300M了,这样我们就拿到了300M左右两个测试视频。
问1:如何将视频制作输出为精准到比特的大小呢?
使用视频制作软件,制作出单位视频
问2:为什么Mac电脑和其他电脑显示同一个视频的大小会有差别?
答:Mac电脑进行计算视频大小的时候是有自己的算法的,不是常规的计算方式,不用管Mac电脑的显示内存大小
三、生成指定大小的图片
我们使用“图片内部藏文件的做法”
三步
1、生成一个 指定大小的.zip文件
# 生成一个100M大小的zip文件
mkfile -n 100m zip100m.zip
2、准备好一张图片
3、合并文件
windows电脑请编写这个.bat文件,并双击执行
copy/b nice.jpeg+zip100m.zip=nice2.jpeg
Mac电脑在命令行直接执行
cat ./nice.jpeg zip100m.zip > nice2.jpeg
这个图片就成了一百多兆大小