public function Generate(KDLMediaDataSet $mediaSet, KDLProfile $profile, array &$targetList) { if ($mediaSet != null && $mediaSet->IsDataSet()) { $rv = $this->Initialize($mediaSet); if ($rv == false) { /* * fix #9599 - handles rm files that fails to extract media info, but still playable by real player - * simulate video and audio elements, although no source mediainfo is provided */ if ($this->_srcDataSet->_container && $this->_srcDataSet->_container->IsFormatOf(array("realmedia"))) { $rmSrc = $this->_srcDataSet; $rmSrc->_errors = array(); $rmSrc->_video = new KDLVideoData(); $rmSrc->_video->_id = $rmSrc->_video->_format = "realvideo"; $rmSrc->_audio = new KDLAudioData(); $rmSrc->_audio->_id = $rmSrc->_audio->_format = "realaudio"; $rmSrc->_warnings[KDLConstants::ContainerIndex][] = KDLWarnings::ToString(KDLWarnings::RealMediaMissingContent); KalturaLog::log("An invalid source RealMedia file thatfails to provide valid mediaInfodata. Set up a flavor with 'default' params."); } else { return false; } } } if ($profile == null) { return true; } $this->GenerateTargetFlavors($profile, $targetList); if (count($this->_srcDataSet->_errors) > 0) { return false; } return true; }
public function GenerateTarget(KDLMediaDataSet $source) { if ($source == null || !$source->IsDataSet() || $this->_flags & self::ForceCommandLineFlagBit) { KalturaLog::log("FORCE " . $this->_flags); $target = clone $this; if ($target->_video && ($target->_video->_gop === null || $target->_video->_gop == 0)) { $target->_video->_gop = KDLConstants::DefaultGOP; } $target->_warnings[KDLConstants::ContainerIndex][] = KDLWarnings::ToString(KDLWarnings::ForceCommandline); } else { $target = $this->generateTargetFlavor($source); if ($target->_video == "" && $target->_audio == "" && $target->_image == "") { // "Invalid File - No media content"; $target->_errors[KDLConstants::ContainerIndex][] = KDLErrors::ToString(KDLErrors::NoValidMediaStream); } if ($target->validateTranscoders($source, $target->_transcoders) == false) { // "No valid transcoder"; $target->_errors[KDLConstants::ContainerIndex][] = KDLErrors::ToString(KDLErrors::NoValidTranscoders); } //kLog::log("==>\n".print_r($target->_transcoders,true)); } $this->generateCommandLines($target, $target->_transcoders); return $target; }
public function GenerateIntermediateSource(KDLMediaDataSet $mediaSet, KDLProfile $profile = null) { /* * Check minimal source validity, else get out */ if ($mediaSet == null || !$mediaSet->IsDataSet()) { return null; } /* * Source is invalid if Initialize() fails, unless it is an ARF */ if (!(isset($mediaSet->_container) && $mediaSet->_container->_format == "arf" || $mediaSet->Initialize())) { return null; } $interSrcProfile = null; $forceAudioStream = false; /* * For ARF ==> webex plugin */ if (isset($mediaSet->_container) && $mediaSet->_container->IsFormatOf(array("arf"))) { $interSrcProfile = $this->setProfileWithIntermediateSource(KDLContainerTarget::COPY, KDLVideoTarget::WVC1A, 4000, 1080, KDLAudioTarget::WMA, 128, 0, 1, "webexNbrplayer.WebexNbrplayer"); /* * Following creates 3 retries for Webex conversions. * Required for the sake of 'garbled audio' issue. */ $interSrcFlavor = $interSrcProfile->_flavors[0]; $interSrcFlavor->_transcoders[] = $interSrcFlavor->_transcoders[0]; $interSrcFlavor->_transcoders[] = $interSrcFlavor->_transcoders[0]; } else { if (isset($mediaSet->_video) && $mediaSet->_video->IsFormatOf(array("gotomeeting", "g2m3", "gotomeeting3"))) { $interSrcProfile = $this->setProfileWithIntermediateSource(KDLContainerTarget::WMV, KDLVideoTarget::WVC1A, 4000, 1080, KDLAudioTarget::WMA, 128, 0, 1, "expressionEncoder.ExpressionEncoder"); } else { if (isset($mediaSet->_video) && ($mediaSet->_container->IsFormatOf(array("qt", "mov")) && $mediaSet->_video->IsFormatOf(array("wmv", "wmv2", "wmv3", "wvc1", "vc1", "vc-1")) && $mediaSet->_audio->IsFormatOf(array("wma", "wma2", "wma3", "windows media audio", "windows media audio 10 professional")))) { $interSrcProfile = $this->setProfileWithIntermediateSource(KDLContainerTarget::MP4, KDLVideoTarget::H264H, 4000, 1080, KDLAudioTarget::AAC, 128, 0, 1, "quickTimeTools.QuickTimeTools"); } else { if (isset($mediaSet->_video) && $mediaSet->_video->IsFormatOf(array("xdvd", "xdva", "xdvb", "xdvc", "xdve", "xdvf", "xdv4", "hdv2"))) { foreach ($profile->_flavors as $flvr) { foreach ($flvr->_transcoders as $trans) { if ($trans->_id == KDLTranscoders::ON2) { $interSrcProfile = $this->setProfileWithIntermediateSource(KDLContainerTarget::MP4, KDLVideoTarget::H264H, 4000, 1080, KDLAudioTarget::AAC, 128, 0, 0, KDLTranscoders::FFMPEG); break; } } if (isset($interSrcProfile)) { break; } } } else { if (isset($mediaSet->_video) && !isset($mediaSet->_audio)) { foreach ($profile->_flavors as $flvr) { if (preg_match('/widevine/', strtolower($flvr->_tags), $matches)) { $interSrcProfile = $this->setProfileWithIntermediateSource(KDLContainerTarget::MP4, KDLVideoTarget::H264H, 4000, 1080, KDLAudioTarget::AAC, 128, 0, 0, KDLTranscoders::FFMPEG); $forceAudioStream = true; break; } } } else { if (isset($mediaSet->_video) && $mediaSet->_video->IsFormatOf(array("wvc1", "wmv3")) && isset($mediaSet->_contentStreams) && isset($mediaSet->_contentStreams->video) && count($mediaSet->_contentStreams->video) > 0 && isset($mediaSet->_contentStreams->video[0]->progressiveSegmented) && $mediaSet->_contentStreams->video[0]->progressiveSegmented == true) { foreach ($profile->_flavors as $flvr) { foreach ($flvr->_transcoders as $trans) { if ($trans->_id == KDLTranscoders::FFMPEG) { $interSrcProfile = $this->setProfileWithIntermediateSource(KDLContainerTarget::MP4, KDLVideoTarget::H264H, 4000, 1080, KDLAudioTarget::AAC, 128, 0, 0, KDLTranscoders::MENCODER); break; } } if (isset($interSrcProfile)) { break; } } } } } } } } /* else if($mediaSet->_video->IsFormatOf(array("tscc","tsc2"))) { $interSrcProfile = $this->setProfileWithIntermediateSource(KDLContainerTarget::MP4, KDLVideoTarget::H264H, 4000, 1080, KDLAudioTarget::AAC, 128, 0, 0, KDLTranscoders::FFMPEG); } */ /* * If no "inter-src" cases ==> get out */ if (!isset($interSrcProfile)) { return null; } KalturaLog::log("Automatic Intermediate Source will be generated"); $targetList = array(); $this->Generate($mediaSet, $interSrcProfile, $targetList); if (count($targetList) == 0) { return null; } if (!isset($targetList[0]->_video->_width)) { $targetList[0]->_video->_width = 0; } //Add silent track to video if ($forceAudioStream) { //When duration is set on the source we will use it instead of the -shortest to avoid large difference between video and audio difference if ($this->_srcDataSet->_video->_duration) { $useToAddSilence = "-t " . $this->_srcDataSet->_video->_duration / 1000; } else { $useToAddSilence = "-shortest"; } $cmd = $targetList[0]->_transcoders[0]->_cmd; $cmd = str_replace("__inFileName__", "__inFileName__ -ar 44100 -ac 2 -f s16le -i /dev/zero " . $useToAddSilence, $cmd); $cmd = str_replace("-an", "-b:a 64k", $cmd); $targetList[0]->_transcoders[0]->_cmd = $cmd; } return $targetList[0]; }