我有一个服务器应用程序,它呈现30 FPS视频流,然后将其实时编码和复用到WebM字节流中.
在客户端,HTML5页面打开一个WebSocket到服务器,当接受连接时,它开始生成流.传递标头后,每个后续WebSocket框架都包含一个WebM SimpleBlock.关键帧每15帧发生一次,当发生这种情况时,将启动一个新的Cluster.
客户端还创建MediaSource,并在从WS接收帧时,将内容附加到其活动缓冲区.在<video>追加第一帧后立即开始播放.
一切都运作得相当好.我唯一的问题是网络抖动导致播放位置在一段时间后偏离实际时间.我目前的解决方案是挂钩updateend事件,检查video.currentTime传入集群上的时间码和时间码之间的差异,并手动更新它currentTime是否超出可接受的范围.不幸的是,这会导致播放中明显的暂停和跳跃,这是相当不愉快的.
该解决方案也有点奇怪:我确切地知道最新的关键帧在哪里,但我必须将其转换为整秒(根据W3C规范)才能将其传递到currentTime其中,浏览器可能必须绕过并找到最近的关键帧.
我的问题是:有没有办法告诉媒体元素总是寻找可用的最新关键帧,或者保持播放时间与系统时钟时间同步?
我正在为由任意数量的char标签参数化的表达式编写模板.
给定参数列表,工厂函数返回不同类型的表达式,具体取决于是否存在相同类型的两个参数或它们是否唯一.
一个具体的例子:假设这A是一个"可标记的"对象,其operator()重载生成一个?Expression<...>.我们a, b, ...将其声明为标签LabelName<'a'>, LabelName<'b'>, ....然后A(a,b,c,d)会产生一个UniqueExpression<'a','b','c','d'>,而反过来A(a,c,b,c)会产生一个RepeatedExpression<'a','c','b','c'>.
为了实现这一点,我不得不?Expression用auto和定义工厂函数decltype.此外,decltype必须级联到另一个,decltype直到元程序完成通过参数的递归并且最终决定返回类型.作为一个例子,我已经为工厂方法隔离了一个相当小的代码.
template <typename... T> struct TypeList { };
template <char C> struct LabelName { };
template <typename... T> class UniqueExpression
{
// Contains implementation details in actual code
};
template <typename... T> class RepeatedExpression
{
// Contains implementation details in actual code
}; …Run Code Online (Sandbox Code Playgroud) 我目前使用以下代码获取有关活动网络套接字的一些信息.到目前为止,我已经确认这适用于Nexus 4(Jellybeans),Nexus 5(Jellybeans,KitKat和Lollipop)以及Sony Xperia设备(Jellybeans).
Process process = Runtime.getRuntime().exec("netstat -n");
process.getOutputStream().close();
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readline()) != null) {
// Parse line for required info
}
reader.close();
Run Code Online (Sandbox Code Playgroud)
我可以依靠上面的代码在大多数真实的Android设备上正常运行吗?
android ×1
c++ ×1
c++11 ×1
decltype ×1
html5 ×1
html5-video ×1
icc ×1
javascript ×1
media-source ×1
netstat ×1