public function delete() { if (!$this->input['id']) { $this->errorOutput(NOID); } $sql = " SELECT * FROM " . DB_PREFIX . "vodinfo WHERE id IN (" . $this->input['id'] . ")"; $q = $this->db->query($sql); $video = array(); while ($r = $this->db->fetch_array($q)) { if (file_exists($r['video_base_path'] . $r['video_path'] . $r['video_filename'])) { $_pathinfo = pathinfo($r['video_path']); if ($_pathinfo['extension'] == 'ssm') { $video_tmp = explode('.', $r['video_filename']); $video[] = $r['video_base_path'] . $r['video_path'] . $video_tmp[0]; } } } if ($video) { foreach ($video as $v) { if (!defined('NOT_CREATE_ISMV') || !NOT_CREATE_ISMV) { @unlink($v . '.ism'); @unlink($v . '.ismv'); } //重命名.ssm目录 $_dir = pathinfo($v); if ($_dir['dirname'] && is_dir($_dir['dirname'])) { rename($_dir['dirname'], $_dir['dirname'] . '_removed'); } } } /*********************判断删除的视频中有没有正在转码的,如果有就停止掉***************/ $ids = explode(',', $this->input['id']); foreach ($ids as $id) { if ($trans_servers = checkStatusFromAllServers($id)) { $transcode = new transcode($trans_servers); $transcode->stop_transcode_task("{$id}"); } } /**************************************************************************/ $this->addItem('success'); $this->output(); }
public function retranscode() { if (!$this->input['id']) { $this->errorOutput(NOID); } $id = intval($this->input['id']); $sql = " SELECT * FROM " . DB_PREFIX . "vodinfo WHERE id = {$id} "; $video = $this->db->query_first($sql); $output_tmp = explode('.', $video['video_filename']); //重新转码只针对源视频 if ($video['source_path']) { $source_path = rtrim($video['source_path'], '/') . '/' . $video['source_filename']; } else { $source_path = ''; } if (!is_file($video['source_base_path'] . $source_path) || !$source_path) { $sql = " UPDATE " . DB_PREFIX . "vodinfo SET status = -1 WHERE id = {$id}"; $this->db->query($sql); hg_do_transcode_fail($data, $id); //将转码失败的信息记录下来 $this->errorOutput(NOFILE); } //判断当前该视频是不是正在转码,如果正在转码就删除该任务 if ($t_server = checkStatusFromAllServers($id)) { $s_tran = new transcode($t_server); $s_tran->stop_transcode_task($id); } $vod_config = transcode_config(); //查询出视频转码的配置信息 if ($this->input['audit_auto']) { $this->settings['App_mediaserver']['extends'] = $this->input['audit_auto']; } //构建提交的转码配置 if (defined('SOBEY_SORTIDS') && SOBEY_SORTIDS) { if (in_array($video['vod_sort_id'], explode(',', SOBEY_SORTIDS))) { $this->input['mp4_from_sobey'] = 1; } } $this->settings['App_mediaserver']['dir'] = $this->settings['App_mediaserver']['dir'] . 'admin/'; $data = array("sourceFile" => array(array('source' => $video['source_base_path'] . $source_path, 'start' => '0', 'duration' => '', 'is_water_marked' => '0')), "id" => "{$id}", "app_id" => APPID, "app_key" => APPKEY, "type" => "transcode_upload", "targetDir" => $video['video_base_path'] . $video['video_path'], "output_filename" => $output_tmp[0], "config" => $vod_config, "force_recodec" => $this->input['force_recodec'] ? '1' : '', "mp4_from_sobey" => $this->input['mp4_from_sobey'] ? '1' : '', "callback" => $this->settings['App_mediaserver'], "absolute_path" => '1'); //如果没传保持原来状态就将状态变成转码中 if (!$this->input['retain_status']) { $sql = "UPDATE " . DB_PREFIX . "vodinfo SET status = 0 WHERE id = {$id}"; $this->db->query($sql); } //如果是制定强制转码的话就要调取该视频第一次提交转码的时候的马赛克和水印配置 if (file_exists(UPLOAD_DIR . 'water/' . $id . '.json')) { $_param = file_get_contents(UPLOAD_DIR . 'water/' . $id . '.json'); $_param = json_decode($_param, 1); if ($data['force_recodec']) { if ($_param['mosaic']) { $data['config']['mosaic'] = $_param['mosaic']; } if ($_param['water']) { $data['config']['water_mark'] = $_param['water']['water_mark']; $data['config']['water_mark_x'] = $_param['water']['water_mark_x']; $data['config']['water_mark_y'] = $_param['water']['water_mark_y']; } } if ($_param['metadata']) { $data['metadata'] = $_param['metadata']; } } //选取转码服务器(此处强制转码与普通转码在选取服务器的时候有所不同) if ($data['force_recodec']) { $tran_server = select_assign_servers(true); } else { $tran_server = select_servers($id); } if (!$tran_server) { $this->errorOutput(NO_SELECT_TRANSERVER); } $trans = new transcode($tran_server); //根据选取到转码服务器是否需要携带文件,选择各自的提交方式 if ($tran_server['need_file']) { $data['upload_file_in_callback'] = "1"; //$data['sourceFile'][0]['url'] = 'http://' . ltrim(SOURCE_VIDEO_DOMIAN,'http://') . '/' . $source_path; $data['sourceFile'][0]['url'] = 'http://' . ltrim(rtrim($video['source_hostwork'], '/'), 'http://') . '/' . $source_path; } $ret = $trans->addTranscodeTask($data); $return = json_decode($ret, 1); if ($return['return'] == 'fail') { $sql = " UPDATE " . DB_PREFIX . "vodinfo SET status = -1 WHERE id = {$id}"; $this->db->query($sql); hg_do_transcode_fail($data, $id); //将转码失败的信息记录下来 } //此处是处理强制转码之后删除json文件 if (file_exists(UPLOAD_DIR . 'water/' . $id . '.json') && $data['force_recodec']) { @unlink(UPLOAD_DIR . 'water/' . $id . '.json'); } echo $ret; }
private function videomark($type) { if (!$this->input['id']) { $this->errorOutput(NOID); //任务id } $vid = intval($this->input['id']); $start = $this->input['start']; //对应每个视频片段的开始时间 $duration = $this->input['duration']; //对应每个视频片段的时长 $source_dir = $this->input['source_dir']; //视频片段的原文件目录 $is_water_marked = $this->input['is_water_marked']; //视频片段的是否已经加过水印 $is_forcecode = $this->input['is_forcecode']; //标识视频是否已经经过强制转码 $video_base_path = $this->input['video_base_path']; //视频的基路径 if (!is_array($start)) { foreach (array("start", "duration", "source_dir") as $v) { ${$v} = array(${$v}); } } if (count($start) != count($duration) || count($start) != count($source_dir)) { $this->errorOutput(NOMATCH); } /****************查询视频配置信息*****************************/ $vod_config = transcode_config(); /***************配置一下转码完成之后视频的存放目录****************/ if ($type == 'transcode_mark') { //判断当前该视频是不是正在转码,如果正在转码就删除该任务 if ($t_server = checkStatusFromAllServers($vid)) { $s_tran = new transcode($t_server); $s_tran->stop_transcode_task($vid); } //拆条的时候要判断原视频是否正在转码中,如果正在转码中,暂时不拆条 $sql = "SELECT * FROM " . DB_PREFIX . "vodinfo WHERE id = '" . $vid . "'"; $cur_video = $this->db->query_first($sql); if ($cur_video['original_id']) { if (checkStatusFromAllServers($cur_video['original_id'])) { $sql = " UPDATE " . DB_PREFIX . "vodinfo SET status = -1 WHERE id = {$vid}"; $this->db->query($sql); $this->addLogs('拆条有误', '', '', '当前拆条的原视频正在转码中,该视频id:' . $vid); $this->errorOutput('当前拆条的原视频正在转码中,请稍后对该视频拆条'); } } $v_videodir = create_video_dir(); $vod_dir_names = $v_videodir[0]; $target_dir = $v_videodir[1]; $all_target_dir = TARGET_DIR . $target_dir; if (!hg_mkdir($all_target_dir) || !is_writeable($all_target_dir)) { $this->errorOutput(NOWRITE); } $output_filename = $vod_dir_names . ''; //为了兼容老版本 if (defined("TARGET_VIDEO_DOMAIN")) { $server_host = ltrim(TARGET_VIDEO_DOMAIN, 'http://'); } else { $server_host = $this->settings['videouploads']['host']; } $sql = " UPDATE " . DB_PREFIX . "vodinfo SET video_base_path = '" . TARGET_DIR . "', video_path = '" . $target_dir . "',video_filename = '" . $output_filename . "." . $vod_config['output_format'] . "',hostwork = 'http://" . $server_host . "' WHERE id = {$vid}"; $this->db->query($sql); } else { //快编的时候由于要覆盖原视频,所以$target_dir目录是原来视频的目录,从数据库查询 $sql = "SELECT video_base_path,video_path,video_filename,transcode_server FROM " . DB_PREFIX . "vodinfo WHERE id = {$vid}"; $arr = $this->db->query_first($sql); //检测该视频有没有被拆过条,如果有的话就不允许快编 if ($this->checkVideoIsSplit($vid)) { $this->addLogs('快编有误', '', '', '该视频已经有拆条不能快编,该视频id:' . $vid); $this->errorOutput('该视频已经有拆条不能快编'); } //判断当前该视频是不是正在转码,如果正在转码就删除该任务 foreach (array($vid, $vid . '_more') as $_vid) { if ($t_server = checkStatusFromAllServers($_vid)) { $s_tran = new transcode($t_server); $s_tran->stop_transcode_task($_vid); } } $target_dir = $arr['video_path']; $filename = explode('.', $arr['video_filename']); $output_filename = $filename[0]; if ($this->input['audit_auto']) { $this->settings['App_mediaserver']['extends'] = $this->input['audit_auto']; } $all_target_dir = $arr['video_base_path'] . $target_dir; } //更新当前清晰度,表明当前视频使用哪个转码配置进行转码的 $sql = " UPDATE " . DB_PREFIX . "vodinfo SET cur_clarity = '" . $vod_config['unique_id'] . "',status = 0,app_uniqueid = 'livmedia',mod_uniqueid = 'livmedia' WHERE id = {$vid}"; $this->db->query($sql); //选取转码服务器 $tran_server = select_servers($vid); if (!$tran_server) { $this->errorOutput(NO_SELECT_TRANSERVER); } $source_conf = array(); foreach ($source_dir as $k => $v) { $source_conf[] = array('source' => $video_base_path[$k] . $source_dir[$k], 'start' => $start[$k], 'duration' => $duration[$k], 'is_water_marked' => $is_water_marked[$k], 'is_recodec' => $is_forcecode[$k], 'url' => $tran_server['need_file'] ? defined("TARGET_VIDEO_DOMAIN") ? 'http://' . ltrim(TARGET_VIDEO_DOMAIN, 'http://') . '/' . $source_dir[$k] : $this->settings['videouploads']['protocol'] . $this->settings['videouploads']['host'] . '/' . $source_dir[$k] : ''); } /**************用curl将视频连同转码参数一并提交过去****************/ $this->settings['App_mediaserver']['dir'] = $this->settings['App_mediaserver']['dir'] . 'admin/'; $data = array("sourceFile" => $source_conf, "id" => "{$vid}", "app_id" => APPID, "app_key" => APPKEY, "type" => $type, "targetDir" => $all_target_dir, "output_filename" => $output_filename, "config" => $vod_config, "callback" => $this->settings['App_mediaserver'], "absolute_path" => '1'); //根据选取到转码服务器是否需要携带文件,选择各自的提交方式 if ($tran_server['need_file']) { $data['upload_file_in_callback'] = "1"; } //头信息 if ($this->settings['metadata']) { $metadata = $this->settings['metadata']; foreach ($metadata as $k => $v) { if (!$v) { unset($metadata[$k]); } else { $metadata[$k] = urlencode($v); } } $data['metadata'] = $metadata; } $trans = new transcode($tran_server); $ret = $trans->addTranscodeTask($data); $return = json_decode($ret, 1); if ($return['return'] == 'fail') { $sql = " UPDATE " . DB_PREFIX . "vodinfo SET status = -1 WHERE id = {$vid}"; $this->db->query($sql); hg_do_transcode_fail($data, $vid); //将转码失败的信息记录下来 } echo $ret; }