Android使用FFmpeg實現定時錄影

來源:互聯網
上載者:User

標籤: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實現定時錄影

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.