dever 6 years ago
parent
commit
3bcbbfe49b
8 changed files with 327 additions and 28 deletions
  1. 30 1
      doc/apidoc.php
  2. 5 11
      live/database/stream.php
  3. 174 0
      live/database/stream_log.php
  4. 45 9
      live/lib/Handle.php
  5. 0 1
      live/lib/Manage.php
  6. 8 4
      live/lib/Qiniu.php
  7. 53 2
      live/src/Api.php
  8. 12 0
      video/database/live.php

+ 30 - 1
doc/apidoc.php

@@ -192,7 +192,7 @@
 /**
  * @api {get} wonderful/live/?l=api.get 获取直播推流信息
  * @apiVersion 1.0.0
- * @apiName live.get
+ * @apiName api.get
  * @apiGroup Live
  *
  * @apiDescription 获取直播推流信息
@@ -211,6 +211,35 @@
  * @apiSuccess {String}   active.stream.url_pic 实时截图地址
  */
 
+/**
+ * @api {get} wonderful/live/?l=api.start 开始推流
+ * @apiVersion 1.0.0
+ * @apiName api.start
+ * @apiGroup Live
+ *
+ * @apiDescription 开始推流
+ *
+ * @apiParam {String} signature 请将字符串signature_dever_2018_jm经过md5加密
+ * @apiParam {Number} id 推流id
+ *
+ * @apiSuccess {Number}   id 推流id
+ * @apiSuccess {Number}   log_id 本次推流日志id
+ */
+
+/**
+ * @api {get} wonderful/live/?l=api.stop 结束推流
+ * @apiVersion 1.0.0
+ * @apiName api.stop
+ * @apiGroup Live
+ *
+ * @apiDescription 结束推流 一定要调用该接口,否则不会生成回放地址
+ *
+ * @apiParam {String} signature 请将字符串signature_dever_2018_jm经过md5加密
+ * @apiParam {Number} id 推流id
+ * @apiParam {Number} log_id 本次推流日志id
+ */
+
+
 /**
  * @api {get} wonderful/main/?l=content.home 获取首页数据
  * @apiVersion 1.0.0

+ 5 - 11
live/database/stream.php

@@ -196,17 +196,6 @@ return array
             //'list'      => true,
         ),
 
-        'url_vod'      => array
-        (
-            'type'      => 'varchar-800',
-            'name'      => '直播回放地址',
-            'default'   => '',
-            'desc'      => '直播回放地址',
-            'match'     => 'option',
-            //'update'    => 'text',
-            //'list'      => true,
-        ),
-
         'info'      => array
         (
             'type'      => 'text-255',
@@ -265,6 +254,11 @@ return array
         (
             '同步所有流' => 'live/lib/manage.getStream',
         ),
+
+        'list_button' => array
+        (
+            'list' => array('推流日志', '"stream_log&search_option_stream_id={id}&oper_parent=stream"'),
+        ),
     ),
 
     # request 请求接口定义

+ 174 - 0
live/database/stream_log.php

@@ -0,0 +1,174 @@
+<?php
+
+$live = function()
+{
+    $array = array();
+    $info = Dever::db('live/info')->state();
+    if($info)
+    {
+        $array += $info;
+    }
+    return $array;
+};
+
+$active = function()
+{
+    $array = array();
+    $info = Dever::db('live/active')->state();
+    if($info)
+    {
+        $array += $info;
+    }
+    return $array;
+};
+
+$stream = function()
+{
+    $array = array();
+    $info = Dever::db('live/stream')->state();
+    if($info)
+    {
+        $array += $info;
+    }
+    return $array;
+};
+
+return array
+(
+    # 表名
+    'name' => 'stream_log',
+    # 显示给用户看的名称
+    'lang' => '直播流日志',
+    'order' => 2,
+    'menu' => false,
+    # 数据结构
+    'struct' => array
+    (
+    
+        'id'        => array
+        (
+            'type'      => 'int-11',
+            'name'      => 'ID',
+            'default'   => '',
+            'desc'      => '',
+            'match'     => 'is_numeric',
+            'search'    => 'order',
+            'list'        => true,
+        ),
+
+        'live_id'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '所属直播云',
+            'default'   => '1',
+            'desc'      => '所属直播云',
+            'match'     => 'is_numeric',
+            'update'    => 'select',
+            //'option'    => $live,
+            'search'    => 'select',
+            //'list'      => true,
+        ),
+
+        'active_id'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '所属活动',
+            'default'   => '1',
+            'desc'      => '所属活动',
+            'match'     => 'is_numeric',
+            'update'    => 'select',
+            //'option'    => $active,
+            'search'    => 'select',
+            //'list'      => true,
+        ),
+
+        'stream_id'       => array
+        (
+            'type'      => 'int-11',
+            'name'      => '所属直播流',
+            'default'   => '1',
+            'desc'      => '所属直播流',
+            'match'     => 'is_numeric',
+            //'update'    => 'select',
+            'option'    => $stream,
+            //'search'    => 'select',
+            'list'      => true,
+        ),
+
+        'sdate'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '开始时间',
+            'match'     => 'is_numeric',
+            'default'   => '',
+            'desc'      => '',
+            'update'    => 'date',
+            'callback'  => 'maketime',
+            'list'      => '{sdate} > 0 ? date("Y-m-d H:i:s", {sdate}) : "未开始"',
+        ),
+
+        'edate'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '结束时间',
+            'match'     => 'is_numeric',
+            'default'   => '',
+            'desc'      => '',
+            //'update'    => 'date',
+            'callback'  => 'maketime',
+            'list'      => '{edate} > 0 ? date("Y-m-d H:i:s", {edate}) : "未结束"',
+        ),
+
+        'url_m3u8'      => array
+        (
+            'type'      => 'varchar-800',
+            'name'      => '直播回放地址',
+            'default'   => '',
+            'desc'      => '直播回放地址',
+            'match'     => 'option',
+            //'update'    => 'text',
+            'list'      => true,
+        ),
+
+        'url_mp4'      => array
+        (
+            'type'      => 'varchar-800',
+            'name'      => '直播回放地址',
+            'default'   => '',
+            'desc'      => '直播回放地址',
+            'match'     => 'option',
+            //'update'    => 'text',
+            'list'      => true,
+        ),
+
+        'state'     => array
+        (
+            'type'      => 'tinyint-1',
+            'name'      => '状态',
+            'default'   => '1',
+            'desc'      => '请选择状态',
+            'match'     => 'is_numeric',
+        ),
+        
+        'cdate'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '创建时间',
+            'match'     => array('is_numeric', time()),
+            'desc'      => '',
+            # 只有insert时才生效
+            'insert'    => true,
+            //'search'  => 'date',
+            //'list'      => 'date("Y-m-d H:i:s", {cdate})',
+        ),
+    ),
+
+    'manage' => array
+    (
+        //'excel'   => true,
+        'delete' => false,
+        'edit' => false,
+        //'insert' => false,
+    ),
+
+);

+ 45 - 9
live/lib/Handle.php

@@ -33,17 +33,49 @@ class Handle
     }
 
     # 保存
-    public function save($id)
+    public function save($id, $log_id)
     {
         $info = Dever::db('live/stream')->one($id);
         $config = Dever::db('live/info')->one($info['live_id']);
         $method = $this->method($config);
 
-        $data['url_vod'] = $config['host'] . $method->save($info['key']);
-        $data['where_id'] = $info['id'];
-        $data['status'] = 3;
+        $info_update['where_id'] = $info['id'];
+        $info_update['status'] = 3;
 
-        Dever::db('live/stream')->update($data);
+        Dever::db('live/stream')->update($info_update);
+
+        Dever::db('live/stream_log')->update(array('edate' => time(), 'where_id' => $log_id));
+
+        return true;
+    }
+
+    # 建立直播日志
+    public function saveLog($id, $log_id = false)
+    {
+        $info = Dever::db('live/stream')->one($id);
+
+        if (!$log_id) {
+            $time = time();
+            $data['sdate'] = $time;
+            $data['stream_id'] = $id;
+            $data['live_id'] = $info['live_id'];
+            $data['active_id'] = $info['active_id'];
+            $id = Dever::db('live/stream_log')->insert($data);
+        } else {
+
+            $config = Dever::db('live/info')->one($info['live_id']);
+            $log = Dever::db('live/stream_log')->one($log_id);
+            $method = $this->method($config);
+            $log['sdate'] = intval($log['sdate']);
+            $log['edate'] = intval($log['edate']);
+            $data['url_m3u8'] = $config['host'] . $method->save($info['key'],0, $log['edate']);
+            $data['url_mp4'] = $config['host'] . $method->save($info['key'], 0, $log['edate'], 'mp4');
+            $data['where_id'] = $log_id;
+            Dever::db('live/stream_log')->update($data);
+            $id = $log_id;
+        }
+        
+        return $id;
     }
 
     # 开始直播
@@ -70,11 +102,11 @@ class Handle
             $info['key'] = $name;
         }
 
-        return $this->get($info);
+        return $this->get($info, true);
     }
 
     # 获取流信息 定时跑
-    public function get($info)
+    public function get($info, $create = false)
     {
         if (!is_array($info)) {
             $info = Dever::db('live/stream')->one($info);
@@ -84,12 +116,16 @@ class Handle
         
         $method = $this->method($config);
 
+        if ($create) {
+            $stream = $method->create($info['key']);
+        } else {
+            $stream = $method->getInfo($info['key']);
+        }
+
         $rtmp = $method->getRtmp($info['key'], $info['times'] * 3600);
 
         $url = $method->getPlay($info['key']);
 
-        $stream = $method->getInfo($info['key']);
-
         $status = array();
         $history = array();
 

+ 0 - 1
live/lib/Manage.php

@@ -82,7 +82,6 @@ class Manage
         $table['标清地址'] = $info['url_hls'];
         $table['普清地址'] = $info['url_hdl'];
         $table['截图地址'] = $info['url_pic'];
-        $table['回放地址'] = $info['url_vod'];
         return Dever::table($table);
     }
 

+ 8 - 4
live/lib/Qiniu.php

@@ -83,15 +83,19 @@ class Qiniu
     }
 
     # 保存直播数据
-    public function save($name, $start = 0, $end = 0)
+    public function save($name, $start = 0, $end = 0, $format = false)
     {
         $stream = $this->get($name);
-        //$format = array("format" => "mp4");
-        //return $stream->saveas($format, $start, $end);
         if ($end <= 0) {
             $end = time();
         }
-        $data = $stream->save($start, $end);
+        if ($format) {
+            $format = array("format" => $format);
+            $data = $stream->saveas($format, $start, $end);
+        } else {
+            $data = $stream->save($start, $end);
+        }
+        
         if (isset($data['fname'])) {
             return $data['fname'];
         }

+ 53 - 2
live/src/Api.php

@@ -26,6 +26,13 @@ class Api
         if ($data) {
             foreach ($data as $k => $v) {
                 $data[$k]['stream'] = Dever::db('live/stream')->getAll();
+                if ($data[$k]['stream']) {
+                	foreach ($data[$k]['stream'] as $k1 => $v1) {
+                		if (!$v1['url_rtmp']) {
+                			unset($data[$k]['stream'][$k1]);
+                		}
+                	}
+                }
             }
             return array('active' => $data);
         } else {
@@ -44,19 +51,63 @@ class Api
         $handle = new Handle();
         $handle->startLive($id);
 
+        # 建立一个推流日志
+        $log_id = $handle->saveLog($id);
+
+        return array('id' => $id, 'log_id' => $log_id);
+    }
+
+    # 结束推流
+    public function stop()
+    {
+        $this->check();
+        $id = Dever::input('id');
+        $log_id = Dever::input('log_id');
+        if (!$id) {
+        	Dever::alert('错误的id');
+        }
+        if (!$log_id) {
+        	Dever::alert('错误的id');
+        }
+        $handle = new Handle();
+        $handle->save($id, $log_id);
+
+        Dever::daemon('api.save?id=' . $id . '&log_id=' . $log_id, 'live');
+
+        //Dever::load('live/api.save?id=' . $id . '&log_id=' . $log_id);
         return 'ok';
     }
 
     # 获取回放地址
     public function save()
     {
-        $this->check();
         $id = Dever::input('id');
+        $log_id = Dever::input('log_id');
         if (!$id) {
         	Dever::alert('错误的id');
         }
+        if (!$log_id) {
+        	Dever::alert('错误的id');
+        }
+        $handle = new Handle();
+        $handle->saveLog($id, $log_id);
+
+        return 'ok';
+    }
+
+    # 获取某个直播视频的所有回放地址
+    public function getVideo()
+    {
+        $id = Dever::input('id');
+        $log_id = Dever::input('sdate');
+        if (!$id) {
+        	Dever::alert('错误的id');
+        }
+        if (!$log_id) {
+        	Dever::alert('错误的id');
+        }
         $handle = new Handle();
-        $handle->save($id);
+        $handle->saveLog($id, $log_id);
 
         return 'ok';
     }

+ 12 - 0
video/database/live.php

@@ -151,6 +151,18 @@ return array
             'list'      => 'date("Y-m-d H:i:s", {sdate})',
         ),
 
+        'edate'     => array
+        (
+            'type'      => 'int-11',
+            'name'      => '结束时间',
+            'match'     => 'is_numeric',
+            'default'   => '',
+            'desc'      => '',
+            //'update'    => 'date',
+            'callback'  => 'maketime',
+            //'list'      => 'date("Y-m-d H:i:s", {edate})',
+        ),
+
 		'num_add_user'		=> array
 		(
 			'type' 		=> 'int-11',