Распараллеливание и H.264 (или, возможно, любой кодек сжатия)?Почему это так сложно? - PullRequest
4 голосов
/ 18 июля 2010

Мое ограниченное (и, вероятно, неправильное?) Понимание сжатия видео заключается в том, что внутрикадровые кадры полностью независимы. Другими словами, все данные изображения для внутреннего кадра (ключевого кадра) полностью сохраняются для этого кадра. Это следующие интеркадры (P и B кадры в H.264, я думаю), которые зависят от данных в других кадрах, которые будут «нарисованы».

Если эти внутренние кадры полностью независимы, почему бы не кодировать смущающе параллельную проблему? Если бы у вас было N процессоров и X I-кадров, вы могли бы просто отдать X / N фрагменты источника каждому процессору для независимого кодирования, а затем соединить их все вместе в конце, верно? Но кажется, что это не так - или, по крайней мере, я не видел ни одного кодера, который бы имел возможность распараллеливания, который мог бы это сделать. Что я не понимаю?

Ответы [ 2 ]

2 голосов
/ 22 июля 2010

Первое, что нужно рассмотреть, это то, куда вы хотите поместить свои внутренние кадры.Для лучшего сжатия вы должны выбрать это мудро, предпочитая, например, смену сцены в середине статической последовательности.Чтобы найти лучшие места, вам нужно проанализировать необработанное видео, что можно сделать за один дополнительный (дорогой) проход или решить на лету, когда вы кодируете.

Таким образом, чтобы разделить поток вКуски, которые вам либо нужно сделать дополнительный проход для анализа или просто произвольно разделить его и потерять некоторую эффективность сжатия.

Тогда вам нужно подумать о том, как у вас есть это сырое видео для кодирования.Либо это поток из вашей программы сжатия откуда-то, либо все это доступно на диске.

Если это поток, то вам не повезло, так как у вас нет произвольного доступа к различным частям потока.Да, вы можете буферизовать его, но быстрый расчет показывает, что для этого потребуется либо МНОГО памяти, либо вам придется буферизовать на диск, что приведет к следующему пункту:

Если у вас есть весь сыройфайл хранится локально, то вы можете разделить части на разные процессы или потоки.За исключением того, что теперь вашей проблемой будет доступ к диску!Учтите, что скорость передачи видео в формате 1080p, 24 кадра в секунду составляет около 4 ГБ в минуту.С единственным процессом, кодирующим это, диск будет сильно занят предоставлением необработанных данных.Это может быть даже самая медленная часть процесса (хотя, вероятно, нет, если ваш жесткий диск не очень фрагментирован!)

Теперь подумайте о том, чтобы 4 процесса получили доступ к одному и тому же файлу, все пытаясь получить необработанные данные вчрезвычайно высокие показатели.Этот жесткий диск просто не сможет поддерживать кодировщики данными - слабое звено будет не медленным процессором, а медленным доступом к данным.

Так что, если у вас нет действительно профессионального набора для храненияВаше несжатое видео, разделение различных секций для параллельного кодирования пока просто не практично.

1 голос
/ 18 июля 2010

Вы правы.Распараллеливание ускоряет его работу.

Фактически кодер x264 обеспечивает возможность параллельного кодирования.

http://www.videolan.org/developers/x264.html

...