录像过程中系统时间改变了,怎么避免带来的悲剧
来源:互联网 发布:centos安装ant 编辑:程序博客网 时间:2024/04/30 22:20
录像过程中系统时间改变了,怎么避免带来的悲剧
在android系统上,我们知道改变系统时间的方法有两种,一种就是通过再设置应用里面设置日期时间,另外一种就是通过网络后台同步时间,在手机平板上这两种是比较多的,当然作为车载设备,一般还会增加用GPS时间来同步系统时间。系统时间改变有这么几种方式,但是在录像过程中系统时间改变了,会有什么危害呢?
通过笔者的实验,如果开始录像是2014年5月20日10点整开始,过了一分钟,加入通过网络已经同步修改了系统时间到2014年7月1日,那么即使这个录像文件实际上只录了5分钟,我们回放这个文件的时候显示的录像文件总时间会有比较大的异常。
/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/
因为在录像文件编码的时候,大多在结束的时候还是会写入一个结束的时间点,这个时间点采用的是系统时间,而不是开始录像的系统时间加上录像持续的时长。这样可想而知会出问题。那怎么避免呢?
笔者在实际工作中是在行车记录仪上使用的,系统时间改变都是通过SystemClock.setCurrentTimeMillis(millis);修改下去的,所以我们可以在调用这个接口的前后去做一点手脚。当然,直接放到SystemClock.java里面是不行的,因为它只是一个lib的通用接口,没有对象在里面。
通过设置应用去修改时间,最终会走到AlarmManagerService.java里的public voidsetTime(long millis)接口里。笔者就在调用前后写了数据库一个存储数据,在行车记录里面监听这个数据的修改,这样就可以在修改时间前,把录像停下来,接到系统时间修改完成后,再启动新的录像。
public void setTime(longmillis) { mContext.enforceCallingOrSelfPermission( "android.permission.SET_TIME", "setTime"); Settings.System.putInt(mContext.getContentResolver(),Settings.System.SET_SYTEM_TIME_STATUS, 0); try { Thread.currentThread().sleep(100);//100ms } catch(Exceptione){} SystemClock.setCurrentTimeMillis(millis); Settings.System.putInt(mContext.getContentResolver(),Settings.System.SET_SYTEM_TIME_STATUS, 1); }
还有NetworkTimeUpdateService.java里面修改系统时间的地方也类似处理一下。
在录像应用里监听这个数据库值的状态,然后在这个content observer里面去会收到值改变的通知,收到这个通知就可以去停止当前的录像,再等这个数据库中的值改变,也就是系统时间设置完成后会设置的这个值,在监听接口里面再去重新启动录像。
private final classSettingsObserver extends ContentObserver { publicSettingsObserver(Handler handler) { super(handler); } @Override public voidonChange(boolean selfChange, Uri uri) { // synchronized(mLock) { // handleSettingsChangedLocked(); audio_out_channel_src = Settings.System.getInt(resolver, Settings.System.SET_SYTEM_TIME_STATUS, 5); Log.d("DeshengDIY","SettingsObserveronChange audio_out_channel_src "+audio_out_channel_src); //在这里去做停止当前录像,然后等系统时间设置完成后,再启动录像 } } resolver =getContentResolver(); mSettingsObserver = newSettingsObserver(mHandler); resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.SET_SYTEM_TIME_STATUS), false,mSettingsObserver);
事实证明,这样的处理是简单有效的。
- 录像过程中系统时间改变了,怎么避免带来的悲剧
- ORACLE物化视图--物化视图日志如何避免系统时间变化带来的影响
- ORACLE物化视图--物化视图日志如何避免系统时间变化带来的影响
- 一个引号带来的悲剧,字段定义
- 一个出轨带来的家庭悲剧
- 卸载360安全卫士带来的悲剧
- 避免Windows服务器由于系统更新带来的计划外重启
- 互联网带来的颠覆,改变了传统的营销套路
- WebGL带来的改变
- 做poster的悲剧过程
- android GB版本的camera,录像过程中按“菜单”键会停止录像
- ARM中改变系统时区时间
- 【悲剧带来的不仅仅只是痛苦,也带…
- Android系统Camera录像过程分析
- Android系统Camera录像过程分析
- Android系统Camera录像过程分析
- Android系统Camera录像过程分析
- Android系统Camera录像过程分析
- jquery库实现iframe自适应内容高度和宽度
- python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
- ThreadLocal
- hdu2089
- 创建进程后得到该进程的主窗口句柄
- 录像过程中系统时间改变了,怎么避免带来的悲剧
- 哈哈
- KVC在定义Model类中的妙用
- JW Player 5.7 去水印版
- iOS Push Notification
- ADF学习:Tree组件的使用
- 匿名内部类、成员类与局部类
- 反向代理原理
- 原文:http://blog.teotigraphix.com/2011/05/17/unity3d-uml-gameobject-cheat-sheet/