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) и планируйте работу с учетом более медленного выполнения. Помня об этих двух рычагах, вы быстро обойдете ошибку и подберете подходящий компромисс для своей конфигурации.