瀏覽代碼

金家渠视频easy_drawin

任敬轩 3 年之前
父節點
當前提交
6520a24da8
共有 2 個文件被更改,包括 161 次插入14 次删除
  1. 7 1
      Modules/Camera/Http/Controllers/Api/CameraApiController.php
  2. 154 13
      Modules/Camera/Services/CameraServices.php

+ 7 - 1
Modules/Camera/Http/Controllers/Api/CameraApiController.php

@@ -80,7 +80,13 @@ class CameraApiController extends BaseController
         $camera_url = CameraList::where('id', $camera_id)->value('camera_url');
 
         if ($is_hak && !$camera_url) {
-            $result = CameraServices::downloadCameraFiles($parent_id, $camera_id);
+            //判断是否是mine配置文件的矿区
+            $mine_res = DB::table('mine_list')->where('id',$parent_id)->get();
+            if(isset($mine_res[0]->title) && in_array($mine_res[0]->title,config('mine'))){
+                $result = CameraServices::getRtspByCameraId($camera_id);
+            }else{
+                $result = CameraServices::downloadCameraFiles($parent_id, $camera_id);
+            }
         } else {
             $result = CameraServices::getCameraUrlByCameraId($camera_id);
         }

+ 154 - 13
Modules/Camera/Services/CameraServices.php

@@ -487,6 +487,147 @@ class CameraServices
         return $result;
     }
 
+    //根据摄像头id获取摄像头播放链接
+    public static function getRtspByCameraId($camera_id,$parent_id)
+    {
+        $result['status'] = true;
+        $result['msg']    = ApiEnum::RETURN_SUCCESS;
+
+        $query = CameraList::where('id', $camera_id)->first();
+
+        if (!$query) {
+            $result['status'] = false;
+            $result['msg'] = ApiEnum::NO_CAMERA_URL;
+            return $result;
+        }
+
+        $degree = MineList::where('id', $query->mine_id)->value('degree');
+
+        $mine_list = MineList::whereIn('id', explode('|', $degree))->select(['title'])->get()->toArray();
+
+        $path = '';
+        foreach ($mine_list as $key => $val) {
+            $path .= '/' . $val['title'];
+        }
+        $path .= '/' . $query->camera_name;
+
+        //标记摄像头为在线状态
+        CameraList::where('id', $camera_id)->update(['camera_status' => CameraEnum::CAMERA_STATUS_ONLINE]);
+
+        //已有拉流id,直接返回拉流链接
+
+
+        $has_file = file_exists(public_path() . '/' . CameraEnum::M3U8_FILE_PATH . $path . '/' . date('Ymd', time()) . '/' . CameraEnum::M3U8_FILE_NAME);
+
+
+        if ($has_file) {
+            $result['data'] = [
+                'camera_id' => $camera_id,
+                'url' => env('EASY_DARWIN_JF_RTSP') . $path
+            ];
+
+            return  $result;
+        }
+
+        $mine_ext = MineListExt::where('mine_id', $parent_id)->first();
+
+        Input::replace(
+            [
+                'url'      => trim($mine_ext->ip, '/') . ':' . $mine_ext->port,
+                'username' => $mine_ext->key,
+                'password' => $mine_ext->secret,
+                'sysId'    => 'PG',
+                'sId'      => $query->index_code,
+                'ip'       => trim(trim($query->ip, 'http://'), 'https://'),
+                'port'     => $query->port,
+            ]
+        );
+
+        $tdwy = new TdwyController();
+        $result_td = $tdwy->getRtspById();
+
+
+        $data = [
+            'url'        => $result_td['content'][0]['url'],
+            'customPath' => $path,
+        ];
+
+        Log::info('请求流媒体服务器参数------------');
+        Log::info($data);
+
+        $curl = env('EASY_DARWIN_JF_URL') . CameraEnum::API_STREAM_START . '?' . http_build_query($data);
+
+        //请求流媒体服务器拉流
+        $curl_res = curl_request($curl);
+
+        Log::info('请求流媒体服务器result------------');
+        Log::info($curl_res);
+
+        if (strpos($curl_res,' ')) {
+            //标记摄像头为异常状态
+            CameraList::where('id', $camera_id)->update(['camera_status' => CameraEnum::CAMERA_STATUS_ERROR]);
+
+            $result['status'] = false;
+            $result['msg']    = ApiEnum::EASY_DAWIN_REQUEST_FAIL;
+            return $result;
+        }
+
+        $result['data'] = [
+            'camera_id' => $camera_id,
+            'url' => env('EASY_DARWIN_JF_RTSP') . $path
+        ];
+
+        //sleep10秒生成文件
+        $i = 1;
+        while ($i <= 10) {
+            //判断m3u8文件是否存在
+            $file_exists = file_exists(public_path() . '/' . CameraEnum::M3U8_FILE_PATH . $path . '/' . date('Ymd', time()) . '/' . CameraEnum::M3U8_FILE_NAME);
+            //判断ts文件是否存在
+            $ts_exists = glob(public_path() . '/' . CameraEnum::M3U8_FILE_PATH . $path . '/' . date('Ymd', time()) . '/' . CameraEnum::TS_FILE_SUFFIX);
+            //查询是否存在封面图
+            $cover_picture = CameraList::where('id', $camera_id)->value('cover_picture');
+
+            if ($file_exists && $ts_exists) {
+                //查询是否存在封面图
+                if (!$cover_picture) {
+                    //获取第一帧作为封面图
+                    $file_name = time() . CameraEnum::COVER_PICTURE_NAME;
+                    $cover_exec = 'ffmpeg -i ' . public_path() . '/' . CameraEnum::M3U8_FILE_PATH . $path . '/' . date('Ymd', time()) . '/' . CameraEnum::M3U8_FILE_NAME . ' -vf "select=between(mod(n\, 25)\, 0\, 0), setpts=N/24/TB" ' . public_path() . '/' . CameraEnum::M3U8_FILE_PATH . $path . '/' . date('Ymd', time()) . '/' . $file_name;
+                    exec($cover_exec);
+
+                    //判断图片是否存在
+                    $picture_exists = file_exists(public_path() . '/' . CameraEnum::M3U8_FILE_PATH . $path . '/' . date('Ymd', time()) . '/' . $file_name);
+
+                    if ($picture_exists) {
+                        //上传图片到oss并更新数据库
+                        $picture_path = self::uploadOssFile($file_name, public_path() . '/' . CameraEnum::M3U8_FILE_PATH . $path . '/' . date('Ymd', time()) . '/');
+                        CameraList::where('id', $camera_id)->update(['cover_picture' => $picture_path]);
+                    }
+                }
+
+                //更新拉流id
+                CameraList::where('id', $camera_id)->update(
+                    [
+                        'revert_id'  => trim($curl_res, '"'),
+                        'updated_at' => date('Y-m-d H:i:s'),
+                    ]
+                );
+                return $result;
+            } else {
+                sleep(1);
+            }
+
+            $i++;
+        }
+
+        //标记摄像头为异常状态
+        CameraList::where('id', $camera_id)->update(['camera_status' => CameraEnum::CAMERA_STATUS_ERROR]);
+
+        $result['status'] = false;
+        $result['msg']    = ApiEnum::EASY_DAWIN_REQUEST_FAIL;
+        return $result;
+    }
+
     //停止流媒体推流
     public static function stopCameraStream()
     {
@@ -981,20 +1122,20 @@ class CameraServices
             mkdir('/www/wwwroot/video.nxjiewei.com/public/' . CameraEnum::M3U8_FILE_PATH . '/' . $path, 0777, true);
         }
 
-        $mine_list = DB::table('mine_list')
-            ->select('mine_list.degree')
-            ->leftJoin('camera_list','camera_list.mine_id','=','mine_list.id')
-            ->where('camera_list.id',$camera_id)->get();
-        if(isset($mine_list)){
-            $mine_id = explode('|',$mine_list[0]->degree)[0];
-            $mine_res = DB::table('mine_list')->where('id',$mine_id)->get();
-        }
-        //取流进程
-        if(isset($mine_res[0]->title) && in_array($mine_res[0]->title,config('mine'))){
-            $exec = 'nohup /usr/bin/ffmpeg -rtsp_transport tcp -i "' . $video_url . '" -b:v 200k -c:v libx264 -c:a copy -s 384*288 -vbsf h264_mp4toannexb -f hls -hls_flags delete_segments -segment_list_size 10 -hls_list_size 2 -threads 4 /www/wwwroot/video.nxjiewei.com/public/' . CameraEnum::M3U8_FILE_PATH . '/' . $path . '/' . CameraEnum::M3U8_FILE_NAME . ' >/dev/null &';
-        }else{
+//        $mine_list = DB::table('mine_list')
+//            ->select('mine_list.degree')
+//            ->leftJoin('camera_list','camera_list.mine_id','=','mine_list.id')
+//            ->where('camera_list.id',$camera_id)->get();
+//        if(isset($mine_list)){
+//            $mine_id = explode('|',$mine_list[0]->degree)[0];
+//            $mine_res = DB::table('mine_list')->where('id',$mine_id)->get();
+//        }
+//        //取流进程
+//        if(isset($mine_res[0]->title) && in_array($mine_res[0]->title,config('mine'))){
+//            $exec = 'nohup /usr/bin/ffmpeg -rtsp_transport tcp -i "' . $video_url . '" -b:v 200k -c:v libx264 -c:a copy -s 384*288 -vbsf h264_mp4toannexb -f hls -hls_flags delete_segments -segment_list_size 10 -hls_list_size 2 -threads 4 /www/wwwroot/video.nxjiewei.com/public/' . CameraEnum::M3U8_FILE_PATH . '/' . $path . '/' . CameraEnum::M3U8_FILE_NAME . ' >/dev/null &';
+//        }else{
             $exec = 'nohup /usr/bin/ffmpeg -i "' . $video_url . '" -vcodec copy -acodec copy -vbsf h264_mp4toannexb -f hls -hls_flags delete_segments -segment_list_size 10 -hls_list_size 2 /www/wwwroot/video.nxjiewei.com/public/' . CameraEnum::M3U8_FILE_PATH . '/' . $path . '/' . CameraEnum::M3U8_FILE_NAME . ' >/dev/null &';
-        }
+//        }
 
         //取流进程
 //        $exec = 'nohup /usr/bin/ffmpeg -i "' . $video_url . '" -vcodec copy -acodec copy -vbsf h264_mp4toannexb -f hls -hls_flags delete_segments -segment_list_size 10 -hls_list_size 2 /www/wwwroot/video.nxjiewei.com/public/' . CameraEnum::M3U8_FILE_PATH . '/' . $path . '/' . CameraEnum::M3U8_FILE_NAME . ' >/dev/null &';