Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Camera2录制的视频出现无法预测的播放问题_Javascript_Android_Html5 Video_Cordova Plugins_Video Encoding - Fatal编程技术网

Javascript 使用Camera2录制的视频出现无法预测的播放问题

Javascript 使用Camera2录制的视频出现无法预测的播放问题,javascript,android,html5-video,cordova-plugins,video-encoding,Javascript,Android,Html5 Video,Cordova Plugins,Video Encoding,我的团队正在使用Cordova框架开发一个移动web应用程序,最初的目标是Android。该应用程序的一个功能是通过自定义媒体捕获插件在用户手机上录制视频,将其保存在本地,使用Cordova文件插件(Cordova插件文件)读取视频,并将其流式传输到Node JS服务器,以便通过流API分发给其他连接的用户 接收流的设备将每个传入块保存在ArrayBuffers数组中,然后通过Blob构造函数将其转换为Blob: let receivedChunks:ArrayBuffer[]=[]; //从n

我的团队正在使用Cordova框架开发一个移动web应用程序,最初的目标是Android。该应用程序的一个功能是通过自定义媒体捕获插件在用户手机上录制视频,将其保存在本地,使用Cordova文件插件(Cordova插件文件)读取视频,并将其流式传输到Node JS服务器,以便通过流API分发给其他连接的用户

接收流的设备将每个传入块保存在ArrayBuffers数组中,然后通过Blob构造函数将其转换为Blob:

let receivedChunks:ArrayBuffer[]=[];
//从node.js服务器接收的视频数据块
//每个区块保存为ArrayBuffer
//ArrayBuffer[]被视为blob零件
const videoBlob=新Blob(receivedChunks,{type:'video/mp4'});
然后,我们使用文件插件将这个blob写入应用程序的Android缓存目录,并获得一个
文件://
URL,以便将视频加载到HTML5
元素中。应用程序使用媒体API和媒体事件对这些
元素的播放进行排队

所有已发布的Cordova(或PhoneGap)插件都不符合我们的UI要求,因此我们基于Camera2 API编写了自己的插件(我们暂时取消了对Android 4.x及以下版本的支持)。我们的插件基于Google示例,在遇到另一个StackOverflow用户引用的相同问题之前,它工作正常:

事实证明,运行安卓6.0棉花糖的三星Galaxy设备存在深度睡眠问题。我们实现了我在回答这个问题时描述的变通方法,部分解决了问题,但留下了混乱的元数据,这意味着我们丢失了设备定向提示(我们的应用程序使用
sensorscape
来保持用户界面的正常运行,因此我们必须对录制的视频应用方向修正,以防止它们倒放)

因此,我们采取了更进一步的解决办法,决定对更正后的视频进行重新编码:

private void转码视频(字符串路径视频)
抛出IOException{
MediaExtractor提取器=新的MediaExtractor();
extractor.setDataSource(pathToVideo);
int trackCount=extractor.getTrackCount();
MediaMuxer muxer=新的MediaMuxer(路径视频+“转码”,MediaMuxer.OutputFormat.muxer\u OUTPUT\u MPEG\u 4);
HashMap indexMap=新的HashMap(trackCount);
对于(int i=0;i
这就是事情变得奇怪的地方

重新编码的视频在大多数其他设备上播放效果似乎都很好,包括一款相当长的嵌入式Moto G LTE(第一代)。但是,当我们在Moto G上同时流式传输和保存多个视频时,重新编码的视频将停止正常播放。没有音频或视频,但
元素会发出所有正常的视频事件,我们希望看到视频是否正常播放-尤其是
'end'
事件会自动触发超过预期的持续时间

如果我们只流式传输并保存两个视频,Moto G可以播放重新编码的视频。同一会话中的其他设备(所有设备都接收来自服务器的同一组视频)S7的重新编码视频似乎没有问题。如果我们在同一会话中从设备集中移除S7,我们有时会看到相同的问题,但有时不会-但当涉及带有重新编码视频的S7时,它是100%一致的

我们的MP4编码有什么明显的错误吗?有没有人意识到同时将多个文件写入速度较慢的Android设备(如Moto G)的闪存中的问题?有没有其他人见过这种奇怪的播放行为,即视频元素触发媒体事件而不实际播放音频或视频

我知道这个问题可能有点缺乏重点,而且涉及到很多变量(代码中可能存在多个故障点,多个设备,不清楚问题是编码、播放还是其他),但如果它为任何人敲响了警钟,并且他们能够提供一些见解,那么我们将不胜感激