Я использую 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}")
Код: Выделить всё
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
Мобильная версия