Android使用FFmpeg实现定时录像

来源:互联网 发布:零基础学c语言 pdf 编辑:程序博客网 时间:2024/04/30 00:19

1、需求分析

在Android下实现定时的录像,首先可以在网络摄像机设置页面实现,在某个时刻录像,但是这种情况福想的视频不是保持在摄像机本地就是上传到摄像机厂家提供的服务器上并不是适应所有的需求。

其次,可以在Android下借助FFmpeg实现保存摄像机的视频流,对于定时功能可以在Android程序中实现。

2、具体实现

(1)定时

定时录像则需要在每一天的某个时刻或者某些时刻进行录像,这样可一借助Android的闹钟机制实现。

Android的闹钟实现上基于AlarmManager这个类的,其中有两个主要的方法:

AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);

    public void set(int type, long triggerAtMillis, PendingIntent operation) {          try {                                                                               manager.set(type, triggerAtMillis, operation);                                 } catch (RemoteException ex) {                                                      }                                                                          }               

<span style="font-family:FangSong_GB2312;font-size:14px;">       public void setRepeating(int type, long triggerAtMillis,                                       long intervalMillis, PendingIntent operation) {                                    try {                                                                                      manager.setRepeating(type, triggerAtMillis, intervalMillis, operation);          } catch (RemoteException ex) {                                                        }                                                                               }                                                                               </span>

第一个方法是简单的注册一个闹铃,第二个方法是设置重复闹铃,就是隔一段时间响一次。

这里使用第二种方法,其具体实现为:

<span style="white-space:pre"></span>Intent intent = new Intent(AlarmSetingActivity.this, AlarmReceiver.class);PendingIntent sender = PendingIntent.getBroadcast(AlarmSetingActivity.this, 0, intent, 0);            long firstTime = SystemClock.elapsedRealtime();// 开机之后到现在的运行时间(包括睡眠时间)            long systemTime = System.currentTimeMillis();            <span style="white-space:pre"></span>Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.setTimeZone(TimeZone.getTimeZone("GMT+8")); // 这里时区需要设置一下,不然会有8个小时的时间差 calendar.set(Calendar.MINUTE, mMinute); calendar.set(Calendar.HOUR_OF_DAY, mHour); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); // 选择的每天定时时间 long selectTime = calendar.getTimeInMillis(); // 如果当前时间大于设置的时间,那么就从第二天的设定时间开始 if(systemTime > selectTime) {     Toast.makeText(AlarmSetingActivity.this, "设置的时间小于当前时间", Toast.LENGTH_SHORT).show();     calendar.add(Calendar.DAY_OF_MONTH, 1);            selectTime = calendar.getTimeInMillis(); } // 计算现在时间到设定时间的时间差 long time = selectTime - systemTime; firstTime += time;            // 进行闹铃注册            AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE);            manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,                            firstTime, 6*60*60*1000, sender);            Log.i(TAG, "time ==== " + time + ", selectTime ===== "            + selectTime + ", systemTime ==== " + systemTime + ", firstTime === " + firstTime);            Toast.makeText(AlarmSetingActivity.this, "设置定时成功! ", Toast.LENGTH_LONG).show();
解释下setRepeat的第一个参数:

AlarmManager.RTC,硬件闹钟,不唤醒手机(也可能是其它设备)休眠;当手机休眠时不发射闹钟。
AlarmManager.RTC_WAKEUP,硬件闹钟,当闹钟发躰时唤醒手机休眠;
AlarmManager.ELAPSED_REALTIME,真实时间流逝闹钟,不唤醒手机休眠;当手机休眠时不发射闹钟。
AlarmManager.ELAPSED_REALTIME_WAKEUP,真实时间流逝闹钟,当闹钟发躰时唤醒手机休眠;
RTC闹钟和ELAPSED_REALTIME最大的差别就是前者可以通过修改手机时间触发闹钟事件,后者要通过真实时间的流逝,即使在休眠状态,时间也会被计算

闹铃注册完了之后发送广播,我们还要接受广播:

<span style="white-space: pre;"></span>public class AlarmReceiver extends BroadcastReceiver {<span style="white-space: pre;"></span>@Override<span style="white-space: pre;"></span>public void onReceive(Context context, Intent intent) {<span style="white-space: pre;"></span>Toast.makeText(context, "~~开始录制视频~~", Toast.LENGTH_LONG).show();new MyThread().start();}class MyThread extends Thread {public void run() {try {@SuppressWarnings("unused")Process proc = Runtime.getRuntime().exec("su  -c ./data/misc/command_record.sh");<span style="white-space: pre;"></span>} catch (IOException e) {<span style="white-space: pre;"></span>// TODO Auto-generated catch block<span style="white-space: pre;"></span>e.printStackTrace();<span style="white-space: pre;"></span>}<span style="white-space: pre;"></span>}<span style="white-space: pre;"></span>} <span style="white-space: pre;"></span>}
还需要在AndroidManifest.xml注册:

<span style="white-space: pre;"></span><receiver            android:name="com.wr.alarmrecord.AlarmReceiver"            android:process=":remote" >        </receiver>
android:process=":remote",代表在应用程序里,当需要该service时,会自动创建新的进程。而如果是android:process="remote",没有“:”分号的,则创建全局进程,不同的应用程序共享该进程。

(2)录像

录像的实现是在android下调用FFmpeg执行命令行命令实现的,思路是:

定时启动后,每隔一段时间调用脚本执行录像命令,将录像保存到SD卡下,但是由于SD卡容量有限,所以当保存的数目到达一定量时就删除文件,录像的命名是以摄像机名字加上日期而成的。脚本如下:

<span style="white-space:pre"></span>#!/system/bin/sh<span style="white-space:pre"></span>file=".count.rec"<span style="white-space:pre"></span>count=0<span style="white-space:pre"></span>da=`date "+%Y-%m-%d-%H-%M-%S"`<span style="white-space:pre"></span>camera="海康威视"<span style="white-space:pre"></span>if [ -f $file ]; then    <span style="white-space:pre"></span>    read count < $file        fi<span style="white-space:pre"></span>if [ $(($count + 1)) -ne 40 ]<span style="white-space:pre"></span>then    <span style="white-space:pre"></span>    echo $(($count + 1))            echo $(($count + 1)) > $file<span style="white-space:pre"></span>else    echo $(($count + 1))            echo 0 > $file    cd /mnt/sdcard/    rm -r admin/<span style="white-space:pre"></span>fi            cd /data/misc/ffmpeg/            ./ffmpeg -y -i rtsp://admin:12345@192.168.1.55 -vcodec copy -acodec copy -t 0:1:0 -f flv /mnt/sdcard/admin/$camera-$da.flv  

3、截图

4、源码下载:

http://download.csdn.net/detail/xdwyyan/8691263

5、参考

http://jakend.iteye.com/blog/1980842

http://blog.csdn.net/liuhaomatou/article/details/22445755

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 快递没有当面验收后发现损坏怎么办 支付宝电脑付款风控异常怎么办 京东买东西地址填错了怎么办 商场卖的衣服跟官网差价大怎么办 网购的衣服有好几个破洞怎么办 出租发票有牌号是假的怎么办 支付宝里的多收多保被降级了怎么办 超市购物卡余额与实际不符怎么办 发广告的公众号无法取消关注怎么办 扣扣需要手机验证码登录怎么办 驾校报了联系不了教练了怎么办 手机号被别人注册了百度网盘怎么办 注册公司云证书申请成功后怎么办 淘宝购物卖家迟迟不发货怎么办 淘宝直播顾客加购物车不下单怎么办 东方航空联程机票航班延误怎么办 别别人伸请更换手机绑定qq怎么办 绑定手机号的扣扣忘记密码怎么办 微信公众号个人主体变更公司怎么办 微信号注册成订阅号了怎么办 微信开通了企鹅影院会员怎么办 注销公众号对公账号填写错误怎么办 国外邮的东西在北京扣了手续怎么办 微信购物商城买的东西不发货怎么办 魅族手机电话图标没有了怎么办 新商盟网页新商盟网页打不开怎么办 京东商城购物车装满了怎么办 商家想入住美团没有营业执照怎么办 旅行团定好的人数临时加人该怎么办 淘宝上发货后12天未收到款怎么办 京东购买的东西烂了怎么办 苹果4s手机激活密码忘了怎么办 小米4c返回键失灵了怎么办 小米4c下面三个键失灵怎么办 谷歌浏览器打不开指定的网址怎么办 电脑上我的电脑图标没了怎么办 手机上的短信图标没了怎么办 qq密保手机被别人换了怎么办 苹果六手机很卡网络不给力怎么办 堡垒之夜卡在载入界面怎么办 登录新福建一直说网络不给力怎么办