2025, Nov 28 21:02

Исправляем ошибку torchcodec «No valid stream found»: фикс с ffmpeg 6.1.1 и переход на pyav

Решение ошибки torchcodec «No valid stream found» при декодировании MP4 в VideoDecoder: закрепите ffmpeg 6.1.1 или переключитесь на pyav для стабильной работы.

При декодировании видео с помощью VideoDecoder из torchcodec вы можете столкнуться с ошибкой выполнения, когда декодер отказывается увидеть корректный поток в на вид обычном MP4. Сообщение об ошибке лаконичное и поначалу сбивает с толку, но, зная причину, исправление оказывается прямолинейным.

Минимальный пример

Ниже фрагмент, который инициализирует видеодекодер torchcodec и выполняет приблизительный поиск по ролику:

import torchcodec

video_path = "/path/to/episode_000000.mp4"
decoder = torchcodec.decoders.VideoDecoder(video_path, seek_mode="approximate")

В проблемных окружениях ошибка проявляется так:

ValueError: No valid stream found in input file. Is -1 of the desired media type?

Что происходит на самом деле

Исключение возникает в процессе декодирования, когда torchcodec пытается добавить видеопоток и не может распознать валидный поток во входном файле. На практике это связано с мультимедийным стеком под капотом torchcodec. Надежное решение — использовать конкретную, проверенную сборку ffmpeg. Если заменить ffmpeg в вашей среде нельзя, прагматичный отходной вариант — переключить видеобэкенд на pyav, смирившись с падением пропускной способности.

Исправление, позволяющее остаться на torchcodec

Зафиксируйте ffmpeg на версии 6.1.1. Это устраняет некорректное определение потока и сохраняет более быстрый путь через torchcodec.

conda install -c conda-forge ffmpeg=6.1.1 -y

С ffmpeg 6.1.1 исходный фрагмент декодера работает как задумано, поэтому менять вызовы torchcodec не нужно.

Запасной вариант: pyav (медленнее, но стабильно)

Если изменить системный ffmpeg нельзя, используйте компромисс — перейдите на pyav. Учтите, что pyav примерно на 40% медленнее torchcodec, так что выбирайте его, когда стабильность важнее максимальной скорости.

import av

video_src = "/path/to/episode_000000.mp4"
stream = av.open(video_src)
for frm in stream.decode(video=0):
    frm.to_image().save("frame-%04d.jpg" % frm.index)

Если вы работаете внутри LeRobot, направьте декодирование через pyav, указав бэкенд прямо в утилитах датасета — без переработки конвейера:

lerobot.common.datasets.video_utils(..., backend="pyav")

Почему это важно

Декодирование видео лежит в основе множества тренировочных и дата-процессинговых конвейеров, поэтому мелкие несовместимости легко превращаются в часы потерь. Совместимая версия ffmpeg возвращает torchcodec на рабочий путь и сохраняет высокую пропускную способность. Переход на pyav — рабочая временная мера, но она ощутимо проигрывает torchcodec по производительности.

Выводы

Если при работе с torchcodec получаете “No valid stream found”, сначала закрепите ffmpeg на версии 6.1.1 — так вы сохраните быстрый путь через torchcodec. Если менять окружение невозможно, переключайтесь на бэкенд pyav (включая параметр backend в LeRobot) и планируйте работу с учетом более медленного выполнения. Помня об этих двух рычагах, вы быстро обойдете ошибку и подберете подходящий компромисс для своей конфигурации.