Comments 27
Больше подробностей. Расскажите про параметры FFmpeg, расскажите про подводные камни, про то, как это всё в связке работает. Субъективно, в статье очень много восторга, или попросту «воды».
Рассказал в статье о проблемах с Gearman, какие проблемы бывают при работе с Amazon. Каюсь про ffmpeg рассказал не очень много. Выложу, апдейт как можно скорее.
Спрошу здесь может кто ответит :) Выставляя например параметром -ab 128k на некоторых файлах получаю другой битрейт, например: 119k или 132k (исходные файлы 160k). Битрейт видео тоже скачет. А какие еще подводные камни бывали у вас?
-acodec libvo_aacenc -ar 44100 -ab 128k

Zeranoe FFmpeg Build (git-ceb0dd9)
libavutil 51. 34.100 / 51. 34.100
libavcodec 53. 54.100 / 53. 54.100
libavformat 53. 29.100 / 53. 29.100
libavdevice 53. 4.100 / 53. 4.100
libavfilter 2. 58.100 / 2. 58.100
libswscale 2. 1.100 / 2. 1.100
libswresample 0. 6.100 / 0. 6.100
libpostproc 51. 2.100 / 51. 2.100
libfaac конвертирует в VBR, libvo_aacenc конвертирует в CBR. В результате использования libfaac 2 файла 3 файла перестали проигрываться. При использовании libvo_aacenc только 1 файл пустой — не проигрывается, но и не падает с ошибками.
Очень интересно, а можно ваши файлы как то получить, я попробую через энкодер прогнать. Если можно в личку.
А как происходит «установка» задач для воркера gearman? Я думаю статья бы выгладила более законченной если бы вы привели пример. За статью спасибо.
Стандартный код из мануала к герману:
		$client= new GearmanClient();
		$client->addServer($this->gearman['host'], $this->gearman['port']);			
		foreach($this->filesToConvert as $key => $fileId) {
			$result = $client->addTaskBackground("convert", $fileId, null, $key);		
		}

		if(!@$client->runTasks()) {
			throw new Zend_Exception("Something went wrong with Gearman");
		}
А регистрация воркера как происходит? Я так понимаю через addFunction где callback метод action экземпляра класса конкретного воркера. Как сами воркеры пускаете? Как их мониторите?
Собрал dispatcher.php в нем инициализирую аутолодер, БД настройки, далее отлавливаю аргументы входящие:
     try {
        //$argv[1] - тип воркера.
	if ($argc == 2) {
		$workerName = "App_Model_Worker_" . $argv[1];
		$Worker = new $workerName();
		$Worker->work();
	}
} catch(Exception $e) {
	echo $e->getMessage();
}

Далее в шеле:
nohup /usr/bin/php dispatcher.php Converter &

логи падают в nohup.out в той же папке где dispatcher.php
Упс… вырезал слишком много кода из воркеров :(
Смотрите описание конструктора в воркерах, должно быть так:

class App_Model_Worker_Converter extends App_Model_Worker_Abstract 
        {
        
    public function __construct($gearman) 
    {
        parent::__construct($gearman);
        $this->addFunction("convert", array($this, "action"));
                //Тут еще немного кода	
    }	
    
    public function action($job)
    {
        $fileId = $job->workload();
        $file = $this->_modelFileResponse->getPrepareToConvertFile($fileId);	
                //Собственно здесь конвертируем.
    }
    }
Да, я вот тоже не понял, как в Gearman мониторить воркеры.
$client= new GearmanClient();
$client->addServer
это все понятно.
Но ведь для мониторинга нужно демона пустить, а как — я не понял…
После установки демона, просто запустите: gearmand
German состоит из трех частей: сервер, клиент и воркер. Сервер запускается в шеле gearmand, клиент уже описан выше (как я добавляю задачу), запуск воркера я тоже уже выше описал.
Все равно никак въехать не могу(
А документация у них на сайте куцая и непонятная.

Воркер — собственно вызываемая функция
Сервер — демон, который мониторит события
Клиент… что такое клиент?

Как им вообще пользоваться и как запустить демон, чтоб он мониторил?
Понимаю, что вопросы возможно глупые и не очень в тему, но очень хочется понять, ибо щтука нужная…
Клиент это тот, кто хочет чтобы была выполнена работа, он отправляет запрос на сервер, с указанием типа работы например converter и необходимой информацией о работе, в свою очередь на сервере регистрируются воркеры с указанием какой тип работы они делают. Т.е. клиент подает задачу на сервер с типом convert, сервер опрашивает воркеры, находит свободный, который может выполнить задачу convert, если воркер занет, он ждет пока этот воркер освободится, и тогда уже этот воркер начинает работу.
Клиент управляет задачами/очередью задач. Создает задачи, назначает приоритеты, получает статусы задач.
Использовал такую схему. ИМХО, не слишком подходит для задач конвертирования, так как нет возможности управления очередью на воркере. К примеру, когда заняты все процессоры конвертацией и приходит новая задача, ее нельзя отложить до освобождения одного из процессоров. Если конвертор один — можно решить втроенным в скрипт буфером, но если серверов несколько, все становится весьма печально.
Можно развернуть облако. Когда не хватает процессорных ресурсов, подтягивать новый инстенц, и на нем разворачивать воркеров, которые зарегистрируются на сервере.
Можно. Но сколько будет потрачено времени ради всего-лишь конвертации видео? Возможно для ресурсов, у которых упор именно на видео, это будет хорошим решением, но мне пришлось вернуться к крону.
Мне сложно что — то сказать сейчас, это лишь как вариант, если когда — нибудь придется решать проблему с нагрузкой, будет видно.
Что вы имеете в виду под «процессоры конвертация»? Воркеры?
Физическое ядро процессора. Один процесс ffmpeg использует одно ядро процессора.
Only those users with full accounts are able to leave comments. Log in, please.