uni-app enumerate 下载视频获取的状态是已完成,但是播放不了

uni-app enumerate 下载视频获取的状态是已完成,但是播放不了

类别 信息
产品分类 uniapp/App
PC开发环境 Windows
PC版本号 Windows 11 家庭中文版 22621.4169
HBuilderX类型 正式
HBuilderX版本号 4.08
手机系统 Android
手机版本号 Android 13
手机厂商 小米
手机机型 安卓的都这样
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码:

// 创建下载任务   
const dtask = plus.downloader.createDownload(it.source, data, function(d, status) {});

// 枚举下载任务并筛选出特定条件的任务
async enumerate(num) {
const id = 1;

try {
    // 使用 plus.downloader.enumerate 枚举下载任务  
    const enumCBs = await new Promise((resolve, reject) => {  
        plus.downloader.enumerate(resolve, num);  
    });  
    // 使用 Promise.all 等待所有异步操作完成  
    const filteredTasks = await Promise.all(enumCBs.map(task => {  
        return new Promise((resolve, reject) => {  
            // 解析本地文件系统的URL  
            plus.io.resolveLocalFileSystemURL(task.filename,  
                (entry) => {  
                    // 判断条件是否符合  
                    if (task.options.cata_id === id) {  
                        resolve(task); // 符合条件,将任务添加到结果数组中  
                    } else {  
                        resolve(null); // 不符合条件,返回 null  
                    }  
                },  
                (error) => {  
                    // 处理解析失败的情况  
                    console.error('解析本地文件系统URL失败:', error);  
                    resolve(null); // 解析失败,返回 null  
                }  
            );  
        });  
    }));  
    // 过滤掉为 null 的任务,并返回结果数组  
    return filteredTasks.filter(task => task !== null);  
} catch (error) {  
    // 捕获枚举任务失败的情况  
    console.error('枚举下载任务失败:', error);  
    return []; // 返回空数组表示没有符合条件的任务  
}  
},  
const taskTypes = [0, 1, 2, 3, 4, 5];  
const res = await Promise.all(taskTypes.map(type => this.enumerate(type)));  
// 合并所有枚举结果  
const results = res.flat();  

// 创建一个映射以快速查找下载任务  
const resultsMap = new Map(results.map(task => [task.options.id, task])); 

const find = resultsMap.get(v.id);
find.state 这个状态显示的状态都是正常的
let isFilename = find.filename.includes('.');
find.filename 这个是不正常的,我现在是不管什么状态如果没有这个是的后缀就强制重新下载解决的

操作步骤:

find.state

预期结果:

find.state === 4 && find.filename 是正常的

实际结果:

find.state === 4 && find.filename 是不正常的

bug描述:

enumerate 下载视频获取的状态是已完成,但是播放不了.

  1. 实际上没有下载完成、或者只下载一半、也能播放一半后就不行
  2. 没有下载路径也显示已经下载完成状态
  3. 下载已经完成、今天可以 、各别的过几天就不行了、得重新下载

更多关于uni-app enumerate 下载视频获取的状态是已完成,但是播放不了的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app enumerate 下载视频获取的状态是已完成,但是播放不了的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在处理 uni-app 中下载视频并播放的问题时,如果下载状态显示为已完成但播放不了,可能是以下几个原因导致的:

  1. 文件路径或权限问题:确保下载的视频文件路径正确,并且应用有权限访问该路径。
  2. 文件格式或编码问题:下载的视频文件格式或编码可能不被播放器支持。
  3. 文件损坏:下载过程中文件可能损坏。

下面是一个基本的 uni-app 示例,展示如何下载视频并尝试播放。请注意,这里假设你已经有一个有效的视频下载 URL 和一个视频播放组件(如 video 组件)。

下载视频

使用 uni.downloadFile 方法下载视频:

// 假设视频URL为 videoUrl
const videoUrl = 'https://example.com/path/to/your/video.mp4';
const tempFilePath = `${wx.env.USER_DATA_PATH}/video.mp4`;

uni.downloadFile({
    url: videoUrl,
    success: (res) => {
        if (res.statusCode === 200) {
            console.log('Download success:', res.tempFilePath);
            // 保存文件路径到全局或组件状态
            this.videoPath = res.tempFilePath;
            // 或者移动文件到永久路径(如果需要)
            uni.saveFile({
                tempFilePath: res.tempFilePath,
                success: (saveRes) => {
                    this.videoPath = saveRes.savedFilePath;
                },
                fail: (err) => {
                    console.error('Save file fail:', err);
                }
            });
        } else {
            console.error('Download fail:', res.statusCode);
        }
    },
    fail: (err) => {
        console.error('Download fail:', err);
    }
});

播放视频

使用 video 组件播放已下载的视频:

<template>
    <view>
        <video
            :src="videoPath"
            controls
            autoplay="false"
            @error="onError"
        ></video>
    </view>
</template>

<script>
export default {
    data() {
        return {
            videoPath: ''
        };
    },
    methods: {
        onError(e) {
            console.error('Video play error:', e.detail);
        }
    }
};
</script>

注意事项

  • 确保 videoUrl 是有效的,并且服务器允许跨域访问。
  • 检查 uni.env.USER_DATA_PATH 是否适用于你的平台(不同平台可能有所不同)。
  • 在 Android 上,如果视频无法播放,检查是否已授予存储权限。
  • 使用 uni.saveFile 将临时文件保存到永久路径时,注意路径和权限管理。

如果上述代码仍然无法解决问题,可能需要进一步检查视频文件本身是否损坏,或者尝试使用其他视频播放器库进行播放。

回到顶部