Декодирование H.264 использует меньше ресурсов ЦП при выводе в формат BGR24.Python

Программы на Python
Ответить
Anonymous
 Декодирование H.264 использует меньше ресурсов ЦП при выводе в формат BGR24.

Сообщение Anonymous »

Я работаю над декодированием на ЦП видео H264 из формата .mp4.
Я использую PyAV, потому что количество потоков, используемых для декодера, легко настроить.
Вот мой код для декодирования видео с использованием PyAV.

Код: Выделить всё

def decode_video_pyav(file_path, in_q: Queue, decoder_threads: int):
"""Decode videos and push frames to queue. Sends sentinel for each worker."""
images_count = 0
container = av.open(file_path)
video_stream = container.streams.video[0]
video_stream.codec_context.thread_count = decoder_threads  # or 0: auto
video_stream.codec_context.thread_type = "AUTO"

print(f"[DECODER] Set codec threads to {video_stream.codec_context.thread_count}")

try:
for frame in container.decode(video_stream):
# print(frame.format.name)
img = frame.to_ndarray(format='bgr24')
# img = frame.to_ndarray(format='yuv420p')
images_count += 1
finally:
container.close()
print(f"[DECODER] Finished decoding {images_count} frames from {file_path}")
Проблема этого кода в том, что если я хочу вернуть изображение в формате BGR, то код будет использовать только 800–900 % загрузки ЦП.

Код: Выделить всё

img = frame.to_ndarray(format='bgr24')
Однако, когда я возвращаю собственный выходной формат
img = frame.to_ndarray(format='yuv420p'). Скрипт может декодировать, используя загрузку процессора до 1200–1300%.
Моя цель — обеспечить больший параллелизм процесса декодирования.
Из того, что я обнаружил, преобразование из yuv420p --> bgr24 также требует больших вычислительных ресурсов и требует 33% задержки для возврата 1 декодированного кадра.
Но я не совсем понимаю почему это узкое место также снижает параллелизм фазы декодера?
Я предполагаю, что преобразование цвета приводит к дополнительной задержке для каждого декодированного изображения, но процесс параллельного декодирования не должен быть затронут.
Обновления:
Моя машина имеет 16 логических ядер, что означает 8 физических ядер с 2 гиперпотоками.
Одна из возможных причин заключается в том, что преобразование YUV420p --> BGR24 требует больших вычислительных ресурсов. Таким образом, вычисления сильно нагружают процессор, который не может использовать технологию Hyper-Threading (наиболее полезно для комбинации операций ввода-вывода + вычислений).

Подробнее здесь: https://stackoverflow.com/questions/798 ... r24-format
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»