Моя основная задача - извлечь I'th , I + 1 ' (следующий), I-1' (предыдущий) фреймы только в виде Y (из YUV 420) из видео mp4. Процедура, которую я сейчас использую:
Я извлек список всех I-кадров из видео с помощью команды - ffprobe "input.mp4" -show_frames | grep 'pict_type=I' -A 1 > frame_info.txt
Затем я использовал скрипт python для анализа этого txt-файла, чтобы найти номера всех I кадров и затем извлечения всех кадров с помощью команды - ffmpeg -i input.mp4 -vf select='eq(n\,{1}),setpts=N/25/TB,extractplanes=y' -vsync 0 -pix_fmt gray {1}.yuv
Это происходит через вызов подпроцесса от python.
Это нормально работает для видео с небольшим разрешением, таких как 240p или 480p, но как только я перехожу к видео 1080p, время для извлечения даже один кадр увеличивается экспоненциально. Поскольку ffmpeg ищет этот номер кадра, чтобы извлечь его, и он должен декодировать файл mp4 до этой точки.
У меня много 1080p файлы, и я искал, чтобы уменьшить время. Решение, о котором я думал, состояло в том, чтобы извлечь все Y-кадры (из YUV 420) из mp4, а затем выбрать только I-кадры, поскольку у меня есть список всех I-кадров с шаг 1., Команда, которую я использую для этого, - ffmpeg -y -i input.mp4 -vf "fps=59.94" -pix_fmt gray file_name.yuv
Проблема 1037 * с приведенным выше кодом состоит в том, что постоянно добавляет только файл yuv но мне нужен отдельный файл y для одного кадра видео mp4.
Мое ограничение - использовать FFmpeg только в том случае, если значение Y в FFmpeg совпадает с желаемым.
TL: DR - Я хочу извлечь только часть Y (из YUV 420p) из видео mp4. Y-образные кадры - это я, I-1-й и I + 1-й кадры.
Спасибо за помощь.