? ? ?在IOS上下载的后端下载的音视频不能播放,主要是音视频和普通的文件下载实现不一样,视频利用http请求头的Range实现边加载边播放。具体如下:
? ? ? ? URL url = new URL("http://XXX.MP3"); ? ? ? ? HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); ? ? ? ? InputStream inputStream = urlConnection.getInputStream(); ? ? ? ? ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ? ? ? ? BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); ? ? ? ? byte[] bytes = new byte[1024]; ? ? ? ? int i = bufferedInputStream.read(bytes); ? ? ? ? while (i > 0) { ? ? ? ? ? ? byteArrayOutputStream.write(bytes, 0, i); ? ? ? ? ? ? i = bufferedInputStream.read(bytes); ? ? ? ? } ? ? ? ? String range = request.getHeader("range"); ? ? ? ? int rangeFrom = 0; ? ? ? ? int rangeTo = byteArrayOutputStream.size() - 1; ? ? ? ? ServletOutputStream outputStream = response.getOutputStream(); ? ? ? ? if (range != null && !"".equals(range) && range.contains("bytes=")) { ? ? ? ? ? ? log.info("range Out:{}", range); ? ? ? ? ? ? String replace = range.replace("bytes=", ""); ? ? ? ? ? ? String[] ranges = replace.split("-"); ? ? ? ? ? ? rangeFrom = Integer.parseInt(ranges[0]); ? ? ? ? ? ? rangeTo = Integer.parseInt(ranges[1]); ? ? ? ? } ? ? ? ? int contentLength = rangeTo - rangeFrom + 1; ? ? ? ? response.setContentLength(contentLength); ? ? ? ? response.setContentType("audio/mpeg");//音视频的ContentType ? ? ? ? response.addHeader("content-disposition", "inline; filename=\"test.mp3\""); ? ? ? ? response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); ? ? ? ? response.addHeader("Content-Range", String.format("bytes %d-%d/%d", rangeFrom, rangeTo, byteArrayOutputStream.size()));//指定音视频加载的范围 ? ? ? ? outputStream.write(byteArrayOutputStream.toByteArray(), rangeFrom, contentLength); ? ? ? ? outputStream.flush(); ? ? ? ? outputStream.close(); ? ? ? ? bufferedInputStream.close(); ? ? ? ? byteArrayOutputStream.close(); ?
|