Извлечение кадра только Y (из YUV420p) из файла MP4 с помощью fmpeg? - PullRequest
0 голосов
/ 07 января 2020

Моя основная задача - извлечь I'th , I + 1 ' (следующий), I-1' (предыдущий) фреймы только в виде Y (из YUV 420) из видео mp4. Процедура, которую я сейчас использую:

  1. Я извлек список всех I-кадров из видео с помощью команды - ffprobe "input.mp4" -show_frames | grep 'pict_type=I' -A 1 > frame_info.txt

  2. Затем я использовал скрипт 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.

  3. Это нормально работает для видео с небольшим разрешением, таких как 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-й кадры.

Спасибо за помощь.

1 Ответ

0 голосов
/ 07 января 2020

На шаге 1 вместо сохранения номеров кадров сохраните pts_time.

Затем на шаге 2 выполните

ffmpeg -copyts -ss X -i input.mp4 -vf select='eq(t\,X),extractplanes=y' -vsync 0 -pix_fmt gray -vframes 1 {1}.yuv

, где X - это время pts_time.

...