IOS 平台 VideoDecoder/MediaAudioPlayer 不能正常播放音视频
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 42/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- ios, javascript
- Área
- api, mobile-dev
Línea de trabajo
Comienza con la demo de mesh4DPlayer.js y el flujo onReady que llama a createVideoDecoder, createMediaAudioPlayer y getFrameData. Compáralo con el ejemplo enlazado de audio/vídeo de WeChat para mini-juegos y reproduce después el comportamiento en Android e iOS. Se considera terminado cuando los fotogramas de vídeo se muestran en iOS mientras el audio continúa reproduciéndose.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Bug 描述
在官方 Demo 中(例如 mesh4DPlayer.js @roamzhen @xxxBW )提供了 createVideoDecoder 的示例代码,但未见关于 createMediaAudioPlayer 的示例。基于文档 [wx.createMediaAudioPlayer](https://developers.weixin.qq.com/miniprogram/dev/api/media/audio/wx.createMediaAudioPlayer.html) 的介绍,我尝试将视频与音频同时播放。测试结果显示:
- Android 平台:视频与音频均可正常播放
- iOS 平台:音视频不能正常播放
重现步骤
- 在页面中添加
<canvas>标签用于视频显示:<canvas id="videoCanvas" type="2d" style="width:300px;height:200px;"></canvas> - 在
onReady生命周期中,通过wx.createSelectorQuery()获取 Canvas 节点,并初始化视频解码器和音频播放器:'use strict'; Page({ data: {}, onLoad() {}, onReady() { const query = wx.createSelectorQuery(); query.select("#videoCanvas") .node() .exec((res) => { const canvas = res[0].node; const ctx = canvas.getContext("2d"); const decoder = wx.createVideoDecoder(); const audio = wx.createMediaAudioPlayer(); let started = false; let imageWidth = 1280; let imageHeight = 720; decoder.on('start', () => { started = true; }); decoder.on('stop', () => { console.info('Video decoding stopped'); decoder.seek(0); }); decoder.on('seek', () => { console.log('seek'); }); decoder.on('bufferchange', (info) => { console.log('bufferchange', info); }); decoder.on('ended', () => { console.info('Video ended, restarting...'); }); const loop = () => { if (started) { const frameData = decoder.getFrameData(); if (frameData && frameData.data) { const imageData = ctx.createImageData(imageWidth, imageHeight); imageData.data.set(new Uint8ClampedArray(frameData.data)); ctx.putImageData(imageData, 0, 0); } } canvas.requestAnimationFrame(loop); }; (async () => { try { const decoderResult = await decoder.start({ source: 'https://baikebcs.bdimg.com/baike-other/big-buck-bunny.mp4', mode: 0 }); imageWidth = decoderResult.width; imageHeight = decoderResult.height; console.log('Video decoder started:', decoderResult); const audioResult = await audio.start(); console.log('Audio player started:', audioResult); await audio.addAudioSource(decoder); } catch (error) { console.error('音视频初始化出错:', error); } })(); loop(); }); }, onUnload() {} }); - 分别在 Android 与 iOS 设备上运行该示例。
预期结果
视频与音频均能正常播放,无论是在 Android 还是 iOS 平台。
实际结果
- Android:视频与音频均可正常播放。
- iOS:音频正常播放,但视频无法显示。
其他提示
- 微信小游戏的音视频播放示例(参考链接:[微信小游戏音视频示例] 能够正常工作,其代码示例如下:
import createRenderer from './render'; const canvas = wx.createCanvas(); const ctx = canvas.getContext('2d'); const systemInfo = wx.getSystemInfoSync(); const { windowWidth, windowHeight, pixelRatio } = systemInfo; canvas.width = windowWidth * pixelRatio; canvas.height = windowHeight * pixelRatio; const offcanvas = wx.createCanvas(); const decoder = wx.createVideoDecoder(); const audio = wx.createMediaAudioPlayer(); let render; const loop = () => { const frameData = decoder.getFrameData(); console.log('getFrameData', !!frameData); if (frameData) { ctx.clearRect(0, 0, canvas.width, canvas.height); const { width, height, data } = frameData; // 通过渲染函数处理视频数据 render(new Uint8Array(data), width, height); ctx.drawImage(offcanvas, 0, 0, canvas.width, height / width * canvas.width); } requestAnimationFrame(loop); }; decoder.start({ source: 'https://baikebcs.bdimg.com/baike-other/big-buck-bunny.mp4', mode: 0 }).then(data => { wx.setPreferredFramesPerSecond(data.fps); render = createRenderer(offcanvas, data.width, data.height); audio.start().then((res) => { console.log('audio start', res); audio.addAudioSource(decoder).then((res2) => { console.log('audio add', res2); loop(); }); }); }); - 该示例在 iOS 平台上视频与音频均能正常播放
期待协助排查具体原因并提供修复建议。谢谢!
- Lenguaje dominante
- JavaScript
- Estrellas
- 7.3k
- Forks
- 2.2k
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de wechat-miniprogram/miniprogram-demo
-
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
-
Dificultad 3/5 1-2 días Aptitud para principiantes 38/100
-
华为系统6.0,AR相当的都不正常Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
-
MacOS中真机预览和真机调试白屏Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 30/100
-
实时人脸检测3D-眼镜试戴。Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
wechat-miniprogram/miniprogram-demo#168 · 1 comentario ·
Todos los issues de wechat-miniprogram/miniprogram-demo
Issues similares
-
Link Checker ReportAbiertoautomated issue report
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 70/100
microsoft/playwright#43640 ·
Los mantenedores suelen responder en 1 día
-
✏️ Editing - Tags
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
openfoodfacts/openfoodfacts-server#15127 ·
Los mantenedores suelen responder en 1 día
-
Add a dark mode toggleAbiertoenhancement good first issue hacktoberfest help wanted
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Andbal23/dynamic-music-pill#195 ·
Los mantenedores suelen responder en 1 día