標籤:android ffmpeg 定時 錄影
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:[email protected] -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
Android使用FFmpeg實現定時錄影