function WriteFragment($download, &$opt) { $this->frags[$download['id']] = $download; $available = count($this->frags); for ($i = 0; $i < $available; $i++) { if (isset($this->frags[$this->lastFrag + 1])) { $frag = $this->frags[$this->lastFrag + 1]; if ($frag['response'] !== false) { LogDebug("Writing fragment " . $frag['id'] . " to flv file"); if (!isset($opt['file'])) { $opt['debug'] = false; if ($this->play) { $outFile = STDOUT; } else { if ($this->outFile) { if ($opt['filesize']) { $outFile = JoinUrl($this->outDir, $this->outFile . '-' . $this->fileCount++ . ".flv"); } else { $outFile = JoinUrl($this->outDir, $this->outFile . ".flv"); } } else { if ($opt['filesize']) { $outFile = JoinUrl($this->outDir, $this->baseFilename . '-' . $this->fileCount++ . ".flv"); } else { $outFile = JoinUrl($this->outDir, $this->baseFilename . ".flv"); } } } $this->InitDecoder(); $this->DecodeFragment($frag['response'], $frag['id'], $opt); $opt['file'] = WriteFlvFile($outFile, $this->audio, $this->video); if ($this->metadata) { WriteMetadata($this, $opt['file']); } $opt['debug'] = $this->debug; $this->InitDecoder(); } $flvData = $this->DecodeFragment($frag['response'], $frag['id'], $opt); if (strlen($flvData)) { $status = fwrite($opt['file'], $flvData, strlen($flvData)); if (!$status) { LogError("Failed to write flv data"); } if (!$this->play) { $this->filesize = ftell($opt['file']) / (1024 * 1024); } } $this->lastFrag = $frag['id']; } else { $this->lastFrag += 1; LogDebug("Skipping failed fragment " . $this->lastFrag); } unset($this->frags[$this->lastFrag]); } else { break; } if ($opt['tDuration'] and $opt['duration'] + $this->duration >= $opt['tDuration']) { LogInfo(""); LogInfo($opt['duration'] + $this->duration . " seconds of content has been recorded successfully.", true); return STOP_PROCESSING; } if ($opt['filesize'] and $this->filesize >= $opt['filesize']) { $this->filesize = 0; $opt['duration'] += $this->duration; fclose($opt['file']); unset($opt['file']); } } if (!count($this->frags)) { unset($this->frags); } return true; }
// Create flv tag $flvTag = " "; WriteByte($flvTag, 0, 8); WriteInt24($flvTag, 1, $rawLength + strlen($codecTag)); WriteFlvTimestamp($flvTag, 0, $time); WriteInt24($flvTag, 8, 0); // Write flv tag footer $audioTag = $flvTag . $codecTag . $data; WriteInt32($audioTag, strlen($audioTag), strlen($audioTag)); if ($config) { $aacCfgW ? $audioTag = "" : ($aacCfgW = true); } $flvData .= $audioTag; } $filePos += $dataLength; $cFilePos = floor($filePos / (1024 * 1024)); if ($cFilePos > $pFilePos) { LogInfo(sprintf("Processed %d/%.2f MB", $cFilePos, $fileSize), true); $pFilePos = $cFilePos; } } // Write output file if (!is_resource($flv)) { $flv = WriteFlvFile($outFile); } fwrite($flv, $flvData); fclose($flv); $timeEnd = microtime(true); $timeTaken = sprintf("%.2f", $timeEnd - $timeStart); LogInfo(sprintf("Processed input file in %s seconds", $timeTaken)); LogInfo("Finished");