Java使用NIO下载视频文件损坏问题排查求助
问题根源与解决方案
你的代码核心问题是下载的不是视频文件本身,而是视频嵌入页面的HTML代码。你用的https://www.dailymotion.com/embed/video/x82n558是Dailymotion的视频嵌入页面URL,浏览器访问这个链接会返回包含播放器的HTML页面,而非视频的二进制数据流,所以保存的文件本质是网页内容,自然无法播放。
解决步骤
1. 获取真实视频资源URL
视频网站的真实媒体文件地址不会直接暴露在嵌入页面URL中,通常会通过页面内的JavaScript、API接口或meta数据加载。以你提供的Dailymotion视频为例:
- 打开嵌入页面,查看页面源代码,搜索包含视频流的关键词(比如
video、src、manifest) - 或者通过浏览器开发者工具的「网络」面板,筛选媒体类型(Media),找到真实的视频请求地址(通常是
.mp4或分片流媒体地址)
2. 修正下载代码
使用真实视频URL替换原嵌入页面URL,同时注意以下细节:
- 用
try-with-resources自动关闭通道和流,避免资源泄漏导致文件不完整 - 添加浏览器请求头(比如
User-Agent),部分网站会拦截非浏览器发起的请求 - 处理HTTP重定向(URL.openStream()默认会处理,但复杂场景建议用HttpClient)
修正后的代码示例
import java.io.FileOutputStream; import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.nio.channels.FileChannel; import java.net.HttpURLConnection; public class VideoDownloader { public void downloadVideo() throws Exception { // 替换为真实的视频资源URL(需自行从页面解析获取) String videoUrl = "真实视频资源的URL"; URL url = new URL(videoUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 添加浏览器请求头,模拟正常访问 conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"); try (ReadableByteChannel readChannel = Channels.newChannel(conn.getInputStream()); FileOutputStream fileOS = new FileOutputStream("C:\\Users\\Tecman\\Desktop\\Knowladge\\video.mp4"); FileChannel writeChannel = fileOS.getChannel()) { // 循环传输数据,确保完整写入 long transferred = 0; long fileSize = conn.getContentLengthLong(); while (transferred < fileSize) { transferred += writeChannel.transferFrom(readChannel, transferred, fileSize - transferred); } } } }
3. 通用视频下载的注意事项
- 不同网站的解析逻辑不同:比如YouTube、Dailymotion、B站的视频地址获取方式差异很大,需要针对目标网站编写页面解析逻辑(可使用Jsoup等HTML解析库)
- 处理流媒体分片:部分网站采用HLS/DASH流媒体协议,需要下载分片后合并,或使用专门的流媒体处理库
- 遵守网站规则:下载视频前需确认目标网站的服务条款,避免侵权行为
内容的提问来源于stack exchange,提问作者Anjula Samarasinghe
相关产品推荐
相关产品推荐

