function cache_url_wav($vid_url, $dir_path, $switches = array(), $ffmpeg = '') { $result = FALSE; $vid_file_path = cache_url($vid_url, $dir_path); if ($vid_file_path) { $result = cache_file_wav($vid_file_path, $switches, $ffmpeg); } return $result; }
function __buildAudio() { $result = FALSE; $c = 0; $y = sizeof(array_keys($this->__mashData['cache_urls'])); foreach ($this->__mashData['cache_urls'] as $url => $true) { $this->_progressStep('CacheFiles', 1 + round(20 * ($c / $y)), 'Caching Media'); $result = cache_url($url, $this->_options['DirCache']); if (!$result) { throw new RuntimeException('Could not cache media file: ' . $url); } $file_path = $result; $ext = file_extension($file_path); switch ($ext) { //case 'mp3': // recent version of ecasound doesn't support seeking mp3s case 'wav': case 'aiff': case 'aif': break; default: // needs to be converted for ecasound $cached_wav = cache_file_wav($file_path, array(), $this->_options['PathFFmpeg']); if (!$cached_wav) { throw new RuntimeException('Could not determine path to audio wav file: ' . $file_path); } if (!empty($this->_options['Verbose'])) { $this->log($cached_wav['command']); } if (!$cached_wav['path']) { throw new RuntimeException('Could not build audio wav file: ' . $file_path); } $file_path = $cached_wav['path']; } $this->__mashData['cache_urls'][$url] = $file_path; $this->_progressStep('CacheFiles', 100, 'Cached Media'); } $this->_progressStep('BuildAudio', 25, 'Building Audio'); $audio_path = $this->_buildDir . 'build/audio.wav'; if ($this->__mashData['has_audio']) { $path = $this->_options['CoderBaseURL']; $cmd = $this->_options['PathEcasound']; $counter = 1; $last_sound = floatval(0); $one = floatval(1); foreach ($this->__mashData['clips'] as $clip) { if (!$clip['audio']) { continue; } // make sure we've got a locally cached file for this url $file_path = $this->__mashData['cache_urls'][$clip['audio']]; if (!$file_path) { throw new RuntimeException('No path for audio URL: ' . $clip['audio']); } $cmd .= ' -a:' . $counter++ . ' -i '; if (floatgtr($clip['loops'], $one)) { $cmd .= ' audioloop,'; } $cmd .= "playat,{$clip['start']},select,{$clip['trimstart']},{$clip['length']},{$file_path}"; if (floatgtr($clip['loops'], $one)) { $cmd .= ' -t:' . $clip['duration'] * $clip['loops']; } $volume = $clip['volume']; $volume = explode(',', $volume); $z = sizeof($volume) / 2; $cmd .= ' -ea:0 -klg:1,0,100,' . $z; for ($i = 0; $i < $z; $i++) { $p = ($i + 1) * 2; $pos = floatval($volume[$p - 2]); $val = floatval($volume[$p - 1]) / floatval(100); if ($pos) { $pos = $clip['length'] * $clip['loops'] * $pos / floatval(100); } $cmd .= ',' . ($clip['start'] + $pos) . ',' . $val; } $last_sound = floatmax($last_sound, $clip['start'] + $clip['length']); } // if there is space at the end, fill it with silence if (floatgtr($this->__mashData['duration'], $last_sound)) { //$this->log('duration = ' . $this->__mashData['duration'] . ' last_sound = ' . $last_sound); $cmd .= ' -a:' . $counter . ' -i '; $cmd .= 'playat,0,tone,sine,0,' . $this->__mashData['duration']; } $cmd .= ' -a:all -z:mixmode,sum'; $cmd .= ' -o ' . $audio_path; } if ($cmd) { $result = $this->_shellExecute($cmd); if (!file_exists($audio_path)) { throw new RuntimeException('Could not build audio: ' . $cmd); } $result = $audio_path; } return $result; }
function __buildAudio($file_path) { if (!empty($this->_options['EncoderAudioExtension'])) { if (get_file_info('audio', $file_path, $this->_options['PathFFmpeg'])) { $this->_progressStep('EncodeAudio', 5, 'Encoding Audio ' . $file_path); $media_path = media_file_path($file_path); $audio_path = $media_path . 'audio.' . $this->_options['EncoderAudioExtension']; $switches = array(); if (!safe_path($audio_path)) { throw new RuntimeException('Could not create path: ' . $audio_path); } $cmd = ''; $cmd .= $this->_options['PathFFmpeg'] . ' -i '; $cmd .= $file_path; $cmd .= ' -ab ' . $this->_options['EncoderAudioBitrate'] . 'k'; $cmd .= ' -ar ' . $this->_options['EncoderAudioFrequency']; //$cmd .= ' -acodec ' . $this->_options['EncoderAudioExtension']; $cmd .= ' -vn ' . $audio_path; $response = $this->_shellExecute($cmd); if (!$response) { throw new RuntimeException('Problem with audio command: ' . $cmd); } if (!file_exists($audio_path)) { throw new RuntimeException('Could not build audio: ' . $response); } $cached_wav = cache_file_wav($file_path, $switches, $this->_options['PathFFmpeg']); if (!$cached_wav) { throw new RuntimeException('Could not determine path to audio wav file: ' . $file_path); } if (!empty($this->_options['Verbose'])) { $this->log($cached_wav['command']); } if (!$cached_wav['path']) { throw new RuntimeException('Could not build audio wav file: ' . $file_path); } $wav_file_path = $cached_wav['path']; // get a more accurate duration reading from WAV file if (!($meta_path = meta_file_path('blah', $wav_file_path))) { throw new RuntimeException('Could not determine meta path for ' . $wav_file_path); } if (!($meta_dir = dir_path($meta_path))) { throw new RuntimeException('Could not determine dir path of ' . $meta_path); } if (!($duration = get_file_info('duration', $wav_file_path, $this->_options['PathFFmpeg']))) { throw new RuntimeException('Could not determine duration of ' . $wav_file_path); } if (!set_file_info($file_path, 'duration', $duration)) { throw new RuntimeException('Could not set duration of ' . $file_path); } // make waveform graphic $this->_ignore[] = $wav_file_path; $audio_path = $media_path . 'audio.' . $this->_options['EncoderWaveformExtension']; $cmd = ''; $cmd .= $this->_options['PathWaveformGenerator'] . ' --input ' . $wav_file_path; $cmd .= ' --height 64 --width 2800'; $cmd .= ' --linecolor ' . $this->_options['EncoderWaveformForecolor']; $cmd .= ' --padding 0'; $cmd .= ' --backgroundcolor ' . $this->_options['EncoderWaveformBackcolor']; $cmd .= ' --output ' . $audio_path; $response = $this->_shellExecute($cmd); if (!file_exists($audio_path)) { throw new RuntimeException('Could not create waveform graphic: ' . $cmd); } $this->_shellExecute('rm -R ' . $meta_dir); $this->_progressStep('EncodeAudio', 100, 'Encoded Audio'); } } }