Bläddra i källkod

easydrawin回放和按类型获取摄像头列表

任敬轩 3 år sedan
förälder
incheckning
caf09794d2

+ 30 - 0
Modules/Camera/Database/Migrations/2022_07_19_172431_update_camera_list_table.php

@@ -0,0 +1,30 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class UpdateCameraListTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('camera_list', function (Blueprint $table) {
+            $table->string('revert_back_id')->default('NullId')->comment('easydrawin回放标识');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+    }
+}

+ 96 - 0
Modules/Camera/Http/Controllers/Api/CameraApiController.php

@@ -21,6 +21,54 @@ use DB;
 
 class CameraApiController extends BaseController
 {
+    //通过摄像头类型获取摄像头
+    public function getCameraByType(){
+        $mine_name = Input::get('mine_name', '');
+        $camera_type = Input::get('camera_type', '');
+
+        if (!$mine_name || !$camera_type) {
+            return self::errorResponse(ApiEnum::STATUS_CODE_EMPTY);
+        }
+
+        $result['status'] = true;
+        $result['msg']    = ApiEnum::RETURN_SUCCESS;
+
+        $mine = DB::table('mine_list')->where('title',$mine_name)->where('deleted_at',null)->first();
+
+        if (!$mine) {
+            $result['status'] = false;
+            $result['msg']    = '矿区名称不存在';
+            return $result;
+        }
+
+        $mine_list = DB::table('mine_list')->where('degree', 'like', $mine->id . '|' . '%')->where('deleted_at',null)->get();
+
+        $mine_array = [];
+
+        foreach($mine_list as $k=>$v){
+            $mine_array[] = $v->id;
+        }
+
+        $query = CameraList::where('is_show', CameraEnum::IS_SHOW_YES)->where('deleted_at',null)->whereIn('mine_id',$mine_array)->where('camera_type',$camera_type)->orderBy('sort', 'desc')->get();
+
+        if (!$query) {
+            $result['status'] = false;
+            $result['msg']    = '矿区下没有摄像头';
+            return $result;
+        }
+
+        $result = [];
+        foreach($query as $k=>$v){
+            $result[$k]['id'] = $v->id;
+            $result[$k]['mine_id'] = $v->mine_id;
+            $result[$k]['camera_name'] = $v->camera_name;
+            $result[$k]['cover_picture'] = $v->cover_picture;
+            $result[$k]['camera_status'] = $v->camera_status;
+            $result[$k]['playback'] = $v->playback;
+        }
+
+        return self::successResponse($result);
+    }
     /**
      * 作者: qiuzijian
      * 注释: 获取摄像头列表
@@ -276,9 +324,57 @@ class CameraApiController extends BaseController
             $result = CameraServices::getPlaybackRtmp($camera_id,$start_time,$end_time);
             return self::successResponse($result);
         }
+    }
 
+    //easydrawin回放URL
+    public function getPlaybackUrlByEasy(){
+        $camera_id = Input::get('camera_id', '');
+        $start_time = Input::get('start_time', '');
+        $end_time = Input::get('end_time', '');
 
+        $result['status'] = true;
+        $result['msg']    = ApiEnum::RETURN_SUCCESS;
 
+        if (!$camera_id || !$start_time || !$end_time) {
+            $result['status'] = false;
+            $result['msg'] = ApiEnum::STATUS_CODE_EMPTY;
+            return $result;
+        }
+
+        $query = CameraList::where('id', $camera_id)->first();
+
+        if (!$query) {
+            $result['status'] = false;
+            $result['msg'] = ApiEnum::NO_CAMERA_URL;
+            return $result;
+        }
+
+        if($query->playback == 0){
+            $result['status'] = false;
+            $result['msg'] = ApiEnum::NO_SUPORT_PLAYBACK;
+            return $result;
+        }
+
+        $str = '.000+';
+        $start_time = date('c', strtotime($start_time));//2022-07-14T08:00:00.000+08:00
+        $start_time = explode('+',$start_time);
+        $start_time = $start_time[0].$str.$start_time[1];
+        $end_time = date('c', strtotime($end_time));
+        $end_time = explode('+',$end_time);
+        $end_time = $end_time[0].$str.$end_time[1];
+
+        $degree = MineList::where('id', $query->mine_id)->value('degree');
+        $degree = explode('|', $degree)[0];
+        $mine_res = DB::table('mine_list')->where('id',$degree)->get();
+
+        //判断是否在配置文件里,在的不用走ffmpeg
+        if(isset($mine_res[0]->title) && in_array($mine_res[0]->title,config('playback'))){
+            $result = CameraServices::getPlaybackRtsp($camera_id,$start_time,$end_time);
+            return self::successResponse($result);
+        }else{
+            $result = CameraServices::getPlaybackByEasy($camera_id,$start_time,$end_time);
+            return self::successResponse($result);
+        }
     }
 
     /**

+ 87 - 0
Modules/Camera/Http/Controllers/Api/HaiKangController.php

@@ -392,6 +392,93 @@ class HaiKangController extends BaseController
         return $result;
     }
 
+    public function getPlaybackByEasy(){
+        $result['status'] = true;
+        $result['msg']    = ApiEnum::RETURN_SUCCESS;
+
+        $camera_id = Input::get('camera_id');
+        $start_time = Input::get('start_time');
+        $end_time = Input::get('end_time');
+
+        $query = CameraList::where('id', $camera_id)->first();
+
+        $degree = MineList::where('id', $query->mine_id)->value('degree');
+        $degree = explode('|', $degree);
+
+        $mine_list = MineList::whereIn('id', explode('|', $degree))->select(['title'])->get()->toArray();
+
+        $path = '';
+        $path = '/'.$mine_list[0]['title'].'/回放'.$start_time;
+        $new_camera_name = str_replace('-','',$query->camera_name);
+        $new_camera_name = str_replace('#','号',$new_camera_name);
+        $path .= '/' . $new_camera_name;
+
+        //已有拉流id,直接返回拉流链接
+        if($query->revert_back_id != 'NullId'){
+            $result['data'] = [
+                'camera_id' => $camera_id,
+                'url' => env('EASY_DARWIN_JF_RTSP') .  $path
+            ];
+            return  $result;
+        }
+
+        $url        = $this->artemis.'/api/video/v1/cameras/playbackURLs';
+        $params['cameraIndexCode'] = $query->index_code;
+        $params['recordLocation']      = 0;
+        $params['protocol']        = 'rtsp';//rtsp
+        $params['beginTime']       = $start_time;
+        $params['endTime']       = $end_time;
+        $params['streamType']      = 1;  //0主码流 1子码流 2第三码流
+        $params['transmode']       = 1;  //0:UDP 1:TCP
+        $params['expand'] = 'transcode=1&systemformat=ps&videotype=h264';
+
+        $this->sign = $this->get_sign($url);
+        $data = $this->curlPost($this->pre_url . $url, json_encode($params));
+        $data = json_decode($data, true);
+
+        if(!$data['data']['url']){//切换码流
+            $params['streamType'] = 0;
+            $this->sign = $this->get_sign($url);
+            $data = $this->curlPost($this->pre_url . $url, json_encode($params));
+            $data = json_decode($data, true);
+        }
+
+        if(!$data['data']['url']){
+            $result['status'] = false;
+            $result['msg'] = ApiEnum::HK_REQUEST_FAIL;
+            return $result;
+        }
+
+        $data = [
+            'url'        => $data['data']['url'],
+            'customPath' => $path,
+        ];
+
+        //请求流媒体服务器拉流
+        $curl = env('EASY_DARWIN_JF_URL') . CameraEnum::API_STREAM_START . '?' . http_build_query($data);
+        $curl_res = curl_request($curl);
+
+        if(strpos($curl_res,' ')){
+            $result['status'] = false;
+            $result['msg']    = ApiEnum::EASY_DAWIN_REQUEST_FAIL;
+            return $result;
+        }
+
+        //更新拉流id
+        CameraList::where('id', $camera_id)->update(
+            [
+                'revert_back_id'  => trim($curl_res, '"'),
+            ]
+        );
+
+        $result['data'] = [
+            'camera_id' => Input::get('camera_id'),
+            'url' => env('EASY_DARWIN_JF_RTSP') . $path
+        ];
+
+        return $result;
+    }
+
     public function getPlaybackRtmp(){
         $camera_id = Input::get('camera_id');
         $start_time = Input::get('start_time');

+ 2 - 0
Modules/Camera/Routes/api.php

@@ -23,6 +23,8 @@ Route::middleware('auth:api')->namespace('Api')->group(function () {
     Route::post('camera/get_hik_rtsp', 'CameraApiController@getHikRtsp');//海康获取rtsp流
     Route::post('camera/playback/getlist', 'CameraApiController@getPlaybackList');//回放时间段列表
     Route::post('camera/playback/geturl', 'CameraApiController@getPlaybackUrl');//回放url
+    Route::post('camera/playback/geturleasy', 'CameraApiController@getPlaybackUrlByEasy');//easydrawin回放url
+    Route::post('camera/getcamerabytype', 'CameraApiController@getCameraByType');//通过摄像头类型获取所有摄像头
 
     //海康视频接口
     Route::get('haikang/monitor/regions/list', 'HaiKangController@getRegionsList');

+ 26 - 0
Modules/Camera/Services/CameraServices.php

@@ -971,6 +971,32 @@ class CameraServices
         return $result;
     }
 
+    //海康easydrawin获取回放rtsp流
+    public static function getPlaybackByEasy($camera_id,$start_time,$end_time)
+    {
+        $query = CameraList::where('id', $camera_id)->first();
+
+        $degree = MineList::where('id', $query->mine_id)->value('degree');
+        $degree = explode('|', $degree);
+
+        $mine_ext = DB::table('mine_list_ext')->where('mine_id',$degree[0])->get();
+
+        Input::replace(
+            [
+                'url'      => trim($mine_ext[0]->ip, '/') . ':' . $mine_ext[0]->port,
+                'key' => $mine_ext[0]->key,
+                'secret' => $mine_ext[0]->secret,
+                'camera_id' => $camera_id,
+                'start_time' => $start_time,
+                'end_time' => $end_time,
+            ]
+        );
+
+        $haikang = new HaiKangController();
+        $result = $haikang->getPlaybackByEasy();
+        return $result;
+    }
+
     //海康ffmpeg获取回放rtmp流
     public static function getPlaybackRtmp($camera_id,$start_time,$end_time)
     {