Переглянути джерело

ffmpeg拉流获取首帧图片

任敬轩 3 роки тому
батько
коміт
95c2e47991

+ 2 - 3
Modules/Camera/Http/Controllers/Api/CameraApiController.php

@@ -90,9 +90,8 @@ class CameraApiController extends BaseController
             }
         } else {
             $result = CameraServices::getCameraUrlByCameraId($camera_id);
-
-            //金凤easydrawin首帧图片
-            // $result = CameraServices::getCameraUrlByEasy($camera_id);
+            //ffmpeg拉流获取首帧图片
+//            $result = CameraServices::getCameraUrlByFfmpeg($camera_id);
         }
 
         return self::successResponse($result);

+ 40 - 79
Modules/Camera/Services/CameraServices.php

@@ -624,7 +624,7 @@ class CameraServices
     }
 
     //硬盘录像机获取rtsp
-    public static function getCameraUrlByEasy($camera_id)
+    public static function getCameraUrlByFfmpeg($camera_id)
     {
         $result['status'] = true;
         $result['msg']    = ApiEnum::RETURN_SUCCESS;
@@ -645,110 +645,71 @@ class CameraServices
         foreach ($mine_list as $key => $val) {
             $path .= '/' . $val['title'];
         }
-        $new_camera_name = str_replace('-','',$query->camera_name);
-        $new_camera_name = str_replace('#','号',$new_camera_name);
-        $path .= '/' . $new_camera_name;
+        $path .= '/' . $query->camera_name . $camera_id;
 
         //标记摄像头为在线状态
         CameraList::where('id', $camera_id)->update(['camera_status' => CameraEnum::CAMERA_STATUS_ONLINE]);
 
         //已有拉流id,直接返回拉流链接
-        if($query->revert_id != 'NullId'){
+        $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
+                'url' => env('VIDEO_SYSTEM_URL') . CameraEnum::M3U8_FILE_PATH . $path . '/' . date('Ymd', time()) . '/' . CameraEnum::M3U8_FILE_NAME . '?' . time(),
             ];
+
             return  $result;
         }
 
-        $data = [
-            'url'        => $query->camera_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;
+        if (!is_dir('/www/wwwroot/video.nxjiewei.com/public/' . CameraEnum::M3U8_FILE_PATH . '/' . $path. '/' . date('Ymd', time()))) {
+            mkdir('/www/wwwroot/video.nxjiewei.com/public/' . CameraEnum::M3U8_FILE_PATH . '/' . $path. '/' . date('Ymd', time()), 0777, true);
         }
+        // dd($result_td['content'][0]['url']);
+        $exec = 'nohup /usr/bin/ffmpeg -i "' . $query->camera_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. '/' . date('Ymd', time()) . '/' . CameraEnum::M3U8_FILE_NAME . ' >/dev/null &';
 
-        //更新拉流id
-        CameraList::where('id', $camera_id)->update(
-            [
-                'revert_id'  => trim($curl_res, '"'),
-                'updated_at' => date('Y-m-d H:i:s'),
-            ]
-        );
+        shell_exec($exec);
 
         $result['data'] = [
             'camera_id' => $camera_id,
-            'url' => env('VIDEO_SYSTEM_URL') . CameraEnum::M3U8_FILE_PATH . $path  . '/' . CameraEnum::M3U8_FILE_NAME . '?' . time(),
+            'url' => env('VIDEO_SYSTEM_URL') . CameraEnum::M3U8_FILE_PATH . $path . '/' . date('Ymd', time()) . '/' . CameraEnum::M3U8_FILE_NAME . '?' . time(),
         ];
 
-        //查询是否存在封面图
-        $cover_picture = CameraList::where('id', $camera_id)->value('cover_picture');
-
-
-            if (!is_dir('/www/wwwroot/video.nxjiewei.com/public/' . CameraEnum::M3U8_FILE_PATH . '/' . $path)) {
-                mkdir('/www/wwwroot/video.nxjiewei.com/public/' . CameraEnum::M3U8_FILE_PATH . '/' . $path, 0777, true);
-            }
-            // dd($result_td['content'][0]['url']);
-            $exec = 'nohup /usr/bin/ffmpeg -i "' . $query->camera_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 &';
-
-            shell_exec($exec);
-
-            //sleep10秒生成文件
-            $i = 1;
-            while ($i <= 10) {
-                //判断m3u8文件是否存在
-                $file_exists = file_exists(public_path() . '/' . CameraEnum::M3U8_FILE_PATH . $path . '/' . CameraEnum::M3U8_FILE_NAME);
-
-                //判断ts文件是否存在
-                $ts_exists = glob(public_path() . '/' . CameraEnum::M3U8_FILE_PATH . $path  . '/' . CameraEnum::TS_FILE_SUFFIX);
-
-                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  . '/' . CameraEnum::M3U8_FILE_NAME . ' -vf "select=between(mod(n\, 25)\, 0\, 0), setpts=N/24/TB" ' . public_path() . '/' . CameraEnum::M3U8_FILE_PATH . $path  . '/' . $file_name;
-                        exec($cover_exec);
-
-                        //判断图片是否存在
-                        $picture_exists = file_exists(public_path() . '/' . CameraEnum::M3U8_FILE_PATH . $path  . '/' . $file_name);
+        //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 ($picture_exists) {
-                            $cms = new CameraServices();
+            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);
 
-                            //上传图片到oss并更新数据库
-                            $picture_path = $cms->uploadOssFile($file_name, public_path() . '/' . CameraEnum::M3U8_FILE_PATH . $path  . '/');
+                    //判断图片是否存在
+                    $picture_exists = file_exists(public_path() . '/' . CameraEnum::M3U8_FILE_PATH . $path . '/' . date('Ymd', time()) . '/' . $file_name);
 
-                            CameraList::where('id', $camera_id)->update(['cover_picture' => $picture_path]);
-                        }
+                    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]);
                     }
-
-                    return $result;
-                } else {
-                    sleep(1);
                 }
 
-                $i++;
+                return $result;
+            } else {
+                sleep(1);
             }
 
+            $i++;
+        }
+
         //标记摄像头为异常状态
         CameraList::where('id', $camera_id)->update(['camera_status' => CameraEnum::CAMERA_STATUS_ERROR]);