小程序
小游戏
企业微信
微信支付
扫描小程序码分享
首先尝试使用 微信开发工具调试,显示:
于是,尝试使用真机调试
代码很简单,初始化一个videoDecoder然后通过start函数载入一个本地视频地址。然后尝试seek stop。
然后报错:
7 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
可以获取,将start函数中的source换成临时地址或者网络地址试试(我用的网络地址测试的),getFrameData需要循环调用才可
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
videodecoder能用了不,半年过去了还是用不了呀,微剪是不是调了内部api~
let video = wx.createVideoDecoder() console.log(video) video.on('start', (v) => { console.log("start", v); video.seek(0); }) video.on('seek', (e) => { console.log("seek", e.position); console.log("frameData", video.getFrameData()) }) video.on('stop', () => console.log(2)) video.start({source: '/assets/crop.mp4', mode: 0}) setTimeout(() => video.seek(1.0), 1000);
在seek之后getFrameData好像就可以了,不要stop。我在android机上稍微试了两下能正常输出frameData。时间是seek事件的e.position,帧内容是getFrameData()。
不过不知道具体什么时候会出现“当缓存区满的时候可能暂停取不到数据”,或者怎么避免这个问题,或者怎么从这个问题中恢复。还不敢用。
————update1
getFrameData()是每次调用都会获取下一帧,seek0之后,不停地调用getFrameData()就能获取每一帧的数据。(遇到null就需要等待一会儿吧(?),这一点还需要测试)
要注意返回的frameData的dts和pts时间戳和时间的对应关系,确定哪一次返回的是哪一帧,这个我还要测试一下,尤其是返回的帧是按pts顺序还是dts顺序。
seek成功后,接下来的几帧似乎还是在seek之前的时间,等到把之前解码的帧消耗掉才会返回新的数据。所以似乎是需要stop后再start+seek才能保证?或者是根据pts时间戳筛选获得的帧,把不是当前时间的帧都扔掉。
有视频录制、剪辑相关需求的小伙伴,可以尝试下【微剪】插件哦,小程序首款视频剪辑工具,接入方便。也可以搜索【微剪插件演示】小程序体验一下。
你好,用手机预览调试。
onLoad: function (options) {
let video = wx.createVideoDecoder()
console.log(video)
video.start({source: '/assets/crop.mp4', mode: 0})
video.on('start', (v) => console.log(v))
video.on('seek', () => console.log(1))
video.on('stop', () => console.log(2))
video.seek(0)
video.stop()
console.log(video.getFrameData())
}
//希望能帮我看一下我是不是调用的不对???
首先IDE里getVideoInfo没法工作,需要ffmpeg,但是装上也不工作。我是Mac机,Windows机可能会工作。这个导致我调试得在手机上,非常的麻烦。
然后VideoDecoder在安卓机和苹果机上表现不一致。做到两种手机都能取出frame很难。
另外start、seek的意义和工作顺序官方文档也说得不清楚。
以下代码,在我的安卓和苹果手机上都取出了帧。大家可以参考一下。
最终在安卓和苹果手机中都是在bufferchange里取到了帧,seek里取不出。
不知道在其他各种手机型号和类型上是否都能工作,大家可以试验后回复一下。
小程序开发坑太多,很多问题官方常年也不解决。差评
wx.chooseMedia({
count: 1,
mediaType: ['video'],
sourceType: ['album', 'camera'],
maxDuration: 60,
camera: 'back',
sizeType: ['compressed'],
success: function(res) {
const videoUrl = res.tempFiles[0].tempFilePath;
wx.getVideoInfo({
src: videoUrl,
success: function(res){
let duration = res.duration;
const videoDecoder = wx.createVideoDecoder();
console.log('getVideoInfo: duration=',duration);
videoDecoder.on('seek',function(){
console.log('decoder: onseeked.')
let frame = videoDecoder.getFrameData();
console.log('seek中取出的视频帧',frame);
// videoDecoder.stop()
}); //on seek
videoDecoder.on('start',function(){
console.log('decoder: started.')
videoDecoder.seek(0);
}); //on start
videoDecoder.on('bufferchange',function(){
console.log('decoder: bufferchanged.')
console.log('bufferchange中取出的视频帧',frame);
});
videoDecoder.start({
source: videoUrl,
mode: 1, //解码模式。0:按 pts 解码;1:以最快速度解码
abortAudio: true, //不需要音频。容易搞出声音来,鸟悄的。
},
fail: function(err){
console.log(err)
},//success
fail: (err) => {
if (err.errMsg.includes('cancel')) {
// 用户取消选择
} else {
// 其他错误
});//wx.chooseMedia
请问下你的能用了吗?我的真机调试报这个错
thirdScriptError
Cannot read property 'MediaToolKit' of undefined
TypeError: Cannot read property 'MediaToolKit' of undefined
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
可以获取,将start函数中的source换成临时地址或者网络地址试试(我用的网络地址测试的),getFrameData需要循环调用才可
videodecoder能用了不,半年过去了还是用不了呀,微剪是不是调了内部api~
let video = wx.createVideoDecoder() console.log(video) video.on('start', (v) => { console.log("start", v); video.seek(0); }) video.on('seek', (e) => { console.log("seek", e.position); console.log("frameData", video.getFrameData()) }) video.on('stop', () => console.log(2)) video.start({source: '/assets/crop.mp4', mode: 0}) setTimeout(() => video.seek(1.0), 1000);
在seek之后getFrameData好像就可以了,不要stop。我在android机上稍微试了两下能正常输出frameData。时间是seek事件的e.position,帧内容是getFrameData()。
不过不知道具体什么时候会出现“当缓存区满的时候可能暂停取不到数据”,或者怎么避免这个问题,或者怎么从这个问题中恢复。还不敢用。
————update1
getFrameData()是每次调用都会获取下一帧,seek0之后,不停地调用getFrameData()就能获取每一帧的数据。(遇到null就需要等待一会儿吧(?),这一点还需要测试)
要注意返回的frameData的dts和pts时间戳和时间的对应关系,确定哪一次返回的是哪一帧,这个我还要测试一下,尤其是返回的帧是按pts顺序还是dts顺序。
seek成功后,接下来的几帧似乎还是在seek之前的时间,等到把之前解码的帧消耗掉才会返回新的数据。所以似乎是需要stop后再start+seek才能保证?或者是根据pts时间戳筛选获得的帧,把不是当前时间的帧都扔掉。
有视频录制、剪辑相关需求的小伙伴,可以尝试下【微剪】插件哦,小程序首款视频剪辑工具,接入方便。也可以搜索【微剪插件演示】小程序体验一下。
你好,用手机预览调试。
onLoad: function (options) {
let video = wx.createVideoDecoder()
console.log(video)
video.start({source: '/assets/crop.mp4', mode: 0})
video.on('start', (v) => console.log(v))
video.on('seek', () => console.log(1))
video.on('stop', () => console.log(2))
video.seek(0)
video.stop()
console.log(video.getFrameData())
}
//希望能帮我看一下我是不是调用的不对???
首先IDE里getVideoInfo没法工作,需要ffmpeg,但是装上也不工作。我是Mac机,Windows机可能会工作。这个导致我调试得在手机上,非常的麻烦。
然后VideoDecoder在安卓机和苹果机上表现不一致。做到两种手机都能取出frame很难。
另外start、seek的意义和工作顺序官方文档也说得不清楚。
以下代码,在我的安卓和苹果手机上都取出了帧。大家可以参考一下。
最终在安卓和苹果手机中都是在bufferchange里取到了帧,seek里取不出。
不知道在其他各种手机型号和类型上是否都能工作,大家可以试验后回复一下。
小程序开发坑太多,很多问题官方常年也不解决。差评
wx.chooseMedia({
count: 1,
mediaType: ['video'],
sourceType: ['album', 'camera'],
maxDuration: 60,
camera: 'back',
sizeType: ['compressed'],
success: function(res) {
const videoUrl = res.tempFiles[0].tempFilePath;
wx.getVideoInfo({
src: videoUrl,
success: function(res){
let duration = res.duration;
const videoDecoder = wx.createVideoDecoder();
console.log('getVideoInfo: duration=',duration);
videoDecoder.on('seek',function(){
console.log('decoder: onseeked.')
let frame = videoDecoder.getFrameData();
console.log('seek中取出的视频帧',frame);
// videoDecoder.stop()
}); //on seek
videoDecoder.on('start',function(){
console.log('decoder: started.')
videoDecoder.seek(0);
}); //on start
videoDecoder.on('bufferchange',function(){
console.log('decoder: bufferchanged.')
let frame = videoDecoder.getFrameData();
console.log('bufferchange中取出的视频帧',frame);
});
videoDecoder.start({
source: videoUrl,
mode: 1, //解码模式。0:按 pts 解码;1:以最快速度解码
abortAudio: true, //不需要音频。容易搞出声音来,鸟悄的。
});
},
fail: function(err){
console.log(err)
}
});
},//success
fail: (err) => {
if (err.errMsg.includes('cancel')) {
// 用户取消选择
} else {
// 其他错误
}
}
});//wx.chooseMedia
请问下你的能用了吗?我的真机调试报这个错
thirdScriptError
Cannot read property 'MediaToolKit' of undefined
TypeError: Cannot read property 'MediaToolKit' of undefined