您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
网页视频不能播放(如何实现在线视频播放?)
文件,上传,视频网页视频不能播放(如何实现在线视频播放?)
发布时间:2020-12-06加入收藏来源:互联网点击:
-
before-send
上传分块前前端请求服务端校验分块是否存在。
type:"POST",url:"/api/media/upload/checkchunk",data:{ // 文件唯一表示 fileMd5:this.fileMd5, // 当前分块下标 chunk:block.chunk, // 当前分块大小 chunkSize:block.end-block.start}
after-send-file
在所有分块上传完成后触发,可以请求服务端合并分块文件。
type:"POST",url:"/api/media/upload/mergechunks",data:{ fileMd5:this.fileMd5, fileName: file.name, fileSize:file.size, mimetype:file.type, fileExt:file.ext}
页面效果
学员使用:
直接解压资料xc-ui-pc-teach到webstorm工作目录通过nginx访问,在nginx中配置 (解决跨域)server { listen 82; server_name localhost; #视频中心 location / { proxy_pass http://127.0.0.1:12000; proxy_set_header Host $http_host; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Methods GET; } #媒资管理后台跨域 location ^~ /api/media/ { proxy_pass http://127.0.0.1:9000/media/; proxy_set_header Host $http_host; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Methods "GET,POST,OPTIONS"; } }
可以访问 http://127.0.0.1:12000/#/media/upload 或者 http://localhost:82/#/media/upload/ 查看页面效果。
5. 媒资服务端编写服务端需要实现如下功能:
1、上传前检查上传环境
检查文件是否上传,已上传则直接返回。
检查文件上传路径是否存在,不存在则创建。
2、分块检查
检查分块文件是否上传,已上传则返回true。
未上传则检查上传路径是否存在,不存在则创建。
3、分块上传
将分块文件上传到指定的路径。
4、合并分块
将所有分块文件合并为一个文件。
在数据库记录文件信息。
由于上传过程复杂,开发时按业务流程分别实现。配置
application.yml配置上传文件的路径:
xc-service-manage-media: upload-location: C:/school/video/ # 媒资保存路径 ffmpeg-path: C:/Java_Soft/xczx/ffmpeg-20180227-fa0c9d6-win64-static/bin/ffmpeg.exe # ffmpeg路径
定义Dao
使用mybatis-plus
@Mapper@Componentpublic interface FileMsgMapper extends BaseMapper<FileMsg> {}
定义controller
@RestController@RequestMapping("/media/upload")public class MediaUploadController { @Autowired MediaUploadService mediaUploadService; /** * 文件上传前的注册 */ @PostMapping("/register") public ResponseResult register(String fileMd5, String fileName, Long fileSize, String mimetype, String fileExt) { return mediaUploadService.register(fileMd5, fileName, fileSize, mimetype, fileExt); } /** * 检测分块 * * @param fileMd5 * @param chunk * @param chunkSize * @return */ @PostMapping("/checkchunk") public ResponseResult checkchunk(String fileMd5, Integer chunk, Integer chunkSize) { return mediaUploadService.checkchunk(fileMd5, chunk, chunkSize); } /** * 上传分块 * * @param file * @param fileMd5 * @param chunk * @return */ @PostMapping("/uploadchunk") public ResponseResult uploadchunk(MultipartFile file, String fileMd5, Integer chunk) { return mediaUploadService.uploadchunk(file, fileMd5, chunk); } /** * 合并分块 * * @param fileMd5 * @param fileName * @param fileSize * @param mimetype * @param fileExt * @return */ @PostMapping("/mergechunks") public ResponseResult mergechunks(String fileMd5, String fileName, Long fileSize, String mimetype, String fileExt) { return mediaUploadService.mergechunks(fileMd5, fileName, fileSize, mimetype, fileExt); }}
定义service (略)由于代码过多,请参见源码。
现在视频已经通过断点续传的方式,上传到了我们的媒资服务器, 接下来就要使用FFmpeg将视频转换成 流媒体。
6.视频处理技术方案如何通过程序进行视频处理?
ffmpeg是一个可行的视频处理程序,可以通过Java调用ffmpeg.exe完成视频处理。
在java中可以使用Runtime类和Process Builder类两种方式来执行外部程序,工作中至少掌握一种。
本项目使用Process Builder的方式来调用ffmpeg完成视频处理。
关于Process Builder的测试如下 :
@Test public void testProcessBuilder(){ ProcessBuilder processBuilder = new ProcessBuilder();// processBuilder.command("ping","127.0.0.1"); processBuilder.command("ipconfig"); //将标准输入流和错误输入流合并,通过标准输入流读取信息 processBuilder.redirectErrorStream(true); try { //启动进程 Process start = processBuilder.start(); //获取输入流 inputStream inputStream = start.getInputStream(); //转成字符输入流 InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"gbk"); int len = -1; char[] c = new char[1024]; StringBuffer outputString = new StringBuffer(); //读取进程输入流中的内容 while ((len= inputStreamReader.read(c))!=-1) { String s = new String(c,0,len); outputString.append(s); System.out.print(s); } inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } @Test public void testFFmpeg(){ ProcessBuilder processBuilder = new ProcessBuilder(); //定义命令内容 List<String> command = new ArrayList<>(); command.add("D:Program Filesffmpeg-20180227-fa0c9d6-win64-staticbinffmpeg.exe"); command.add("-i"); command.add("E:ffmpeg_test1.avi"); command.add("-y");//覆盖输出文件 command.add("-c:v"); command.add("libx264"); command.add("-s"); command.add("1280x720"); command.add("-pix_fmt"); command.add("yuv420p"); command.add("-b:a"); command.add("63k"); command.add("-b:v"); command.add("753k"); command.add("-r"); command.add("18"); command.add("E:ffmpeg_test1.mp4"); processBuilder.command(command); //将标准输入流和错误输入流合并,通过标准输入流读取信息 processBuilder.redirectErrorStream(true); try { //启动进程 Process start = processBuilder.start(); //获取输入流 InputStream inputStream = start.getInputStream(); //转成字符输入流 InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"gbk"); int len = -1; char[] c = new char[1024]; StringBuffer outputString = new StringBuffer(); //读取进程输入流中的内容 while ((len= inputStreamReader.read(c))!=-1) { String s = new String(c,0,len); outputString.append(s); System.out.print(s); } inputStream.close(); } catch (IOException e) { e.printStackTrace(); } }
上一篇:网页打不开的原因(电脑打不开网页怎么办?快看看是不是dns配置错误)
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |