无论是客户端上传还是服务端上传,在文件传输过程中都会碰到下面几个常见的质量问题:
衡量上传质量的指标有:上传速度和成功率。
本文将基于云点播上传的场景,从原因分析和解决方案两个方面进行着重介绍,您可以根据自己的业务场景进行比对,选择合适的方案提高上传质量。
网络带宽是指在单位时间内能传输的数据量。带宽越大,单位时间内上传的数据量也越大,体现出来就是上传速度越快。上传是端对端的行为,所以两端的带宽对上传质量都有影响,而云点播后台服务器目前带宽充足,所以上传质量往往取决于用户侧的带宽。
上传的文件最终在云点播都需要进行存储,存储的地方即是存储中心。用户开通云点播后,云点播默认会分配重庆地域作为存储中心。用户与存储中心的距离会影响网络链路的长度。
例如,相同文件,用户在北京上传到重庆,相比在成都上传到重庆,中间经过的链路会更长,影响的因素也会随着距离的增加而变多,最终导致上传速度变慢。因为长链路传输,中间环节出现的网络抖动、丢包等问题,也会影响上传成功率。短链路也不能避免这些问题,只是相比长链路,出现的概率会降低不少。减少用户与存储中心的距离,是提高上传质量的关键一步。
弱网是指一种网络的状态,出现高延迟、高丢包,表现行为即我们平时所说的“上网很慢”。弱网问题在现实生活中也很常见,例如在电梯和地铁里,主要原因是所处环境的信号传输不佳,导致数据包传输慢或者失败。这种场景在客户端上传尤为居多,特别是目前移动互联网盛行的时代,弱网问题困扰着许多开发者,这个也是提高成功率指标最难突破的问题。
对于网络带宽不足的场景,直接的办法就是申请更大的带宽。如果我们面临的是一个有限的带宽网络,如何充分的利用带宽进行上传,这是需要我们解决的。并发上传分为两个维度:
无论是前者还是后者,都可以通过调整对应的并发数,提高带宽的利用率。
文件并发上传是利用多个进程或者线程,同时发起上传操作。目前云点播没有提供相关的 SDK 包装,用户可以参考具体的语言特性进行实现,下面基于云点播 Java SDK 提供一个简单的示例:
import com.qcloud.vod.VodUploadClient;
import com.qcloud.vod.model.VodUploadRequest;
import com.qcloud.vod.model.VodUploadResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) throws Exception {
// 并发数
Integer threadNumber = 20;
// 待上传的文件路径列表
List<String> filePathList = new ArrayList<String>();
// 添加待上传文件路径
filePathList.add("/data/path1.mp4");
filePathList.add("/data/path2.mp4");
filePathList.add("/data/path3.mp4");
// 创建线程池
ExecutorService pool = Executors.newFixedThreadPool(threadNumber);
// 创建上传Client
VodUploadClient client = new VodUploadClient("your secretId", "your secretKey");
// 并发上传
for (String path : filePathList) {
// 提交上传任务
pool.submit(new UploadThread(client, path));
}
}
}
// 上传线程
class UploadThread implements Runnable {
// 上传 Client
private VodUploadClient uploadClient;
// 文件路径
private String filePath;
public UploadThread(VodUploadClient uploadClient, String filePath) {
this.uploadClient = uploadClient;
this.filePath = filePath;
}
public void run() {
VodUploadRequest request = new VodUploadRequest();
request.setMediaFilePath(filePath);
try {
// 执行上传
VodUploadResponse response = uploadClient.upload("ap-guangzhou", request);
System.out.println(response.getFileId());
} catch (Exception e) {
e.printStackTrace();
}
}
}
分片并发上传是针对大文件,拆分成多个分片同时进行上传。分片并发上传的优势在于可以快速完成单个文件的上传,云点播提供的 SDK 会根据用户文件的长度,自动选择普通上传以及分片上传,用户不用关心分片上传的每个步骤,即可实现分片上传。而文件的分片并发数通过ConcurrentUploadNumber
参数进行指定,具体的使用示例参考对应 SDK,目前已经支持该参数的 SDK 列表如下:
就近上传是指能够感知上传者所处的位置,分配离上传者最近的存储中心进行上传。例如,成都的用户会分配重庆地域进行上传,而不会分配到上海地域。
就近上传的能力带来最大的收益是减少了上传者到服务器的传输距离,其优点如下:
云点播本身支持就近上传的能力,您只需简单确认下面两点:
FileId
,通过 获取媒体详细信息接口 返回的基础信息(basicInfo)进行确认,其中就包含了StorageRegion
字段,代表媒体文件存储地区。如果上传者中间经过了代理或者转发,导致最后云点播通过 IP 识别地区有误,也可以通过强制指定存储地域,上传到目标地域中,具体用法请参见:
预探测上传主要是一种针对各类网络错误场景进行优化的手段,例如网络连接失败、超时、DNS 劫持等,是云点播针对弱网上传提出的一种有效缓解方案,优化的策略包括下面几点:
预探测上传的能力目前应用在客户端上传中,接入方式简单,具体的用法参考 SDK 中预上传
的说明:
本页内容是否解决了您的问题?