Извлекайте Y-канал каждого I-кадра из фильма MPEG4 максимально без потерь
633
Goat-Anti-Rabbit
Я работаю над экспериментом по отслеживанию видео и застрял с видео, которое сильно сжато с помощью кодека MPEG4 DivX 5x / 6x. Я довольно плохо знаком с форматами изображений, кодеками и сжатием, но, думаю, я понял, что застрял с этим качеством, если не нарушу второй закон термодинамики.
Теперь для отслеживания моих насекомых (да, это то, что я делаю), меня интересуют только I кадры (частота кадров достаточно высока), и меня не интересуют цветовые каналы U и V, поскольку они имеют только одно значение для каждого блока и, следовательно, не дает мне разрешение, которое я хочу. Это Y-канал, который содержит всю интересующую меня информацию. Я сам написал свой трекер, и он не может анализировать видео, поэтому ему нужна папка с кадрами.
Теперь мой вопрос: как я могу извлечь все I-кадры в изображения в оттенках серого (только Y-канал) БЕЗ какой-либо дальнейшей потери качества? Я работаю в Ubuntu 14.04 и предпочитаю использовать ffmpeg или imageJ, так как они уже присутствуют в моем конвейере. Где я сейчас нахожусь:
Я думаю, я понял, что каждый второй кадр - это I-кадр, но я не уверен в этом. Я использовал:
ffprobe -show_frames movie.avi | grep -A2 "video" | grep "key_frame" output: key_frame=1 key_frame=0 key_frame=1 key_frame=0 key_frame=1 key_frame=0 key_frame=1 key_frame=0 key_frame=1 key_frame=0 -- this goes on for exactly the number of frames, as this bit of code tells me: ffprobe -show_frames movie.avi | grep -A2 "video" | grep -c "key") 13369
Теперь я подумал, как выяснить, как извлечь каждый кадр:
Что я делаю неправильно? Почему он возвращает мне все кадры?
Будет ли JPEG привести к дальнейшим потерям? Или это такое же сжатие, как и внутрикадровое в mpeg4? Должен ли я использовать TIFF вместо этого?
Как мне извлечь только Y-канал?
Это нормально, я получаю I-кадр каждый второй кадр? Я немного читал в кодировке MPEG4, и кажется, что в качестве ссылки используются не целые кадры, а скорее блоки? Я тогда извлекаю все кадры, которые содержат такие блоки? Есть ли более высокий уровень с «реальными» целыми системами отсчета?
Я думаю, что нет способа восстановить больше качества?
Большое, большое спасибо за вашу помощь!
С наилучшими пожеланиями,
Рик Вердонк
1 ответ на вопрос
4
Gyan
ffmpeg неявно использует частоту кадров источника, если явно не указано иное. Если количество кадров, подаваемых декодером / фильтром, отличается от этой скорости, то кадры дублируются или отбрасываются для достижения этого. Это можно исправить, создав новые временные метки для каждого выбранного кадра или указав частоту кадров, которая соответствует частоте I-кадров в 1 секунду видео. Безопаснее сделать первым.
Вы можете использовать TIFF или PNG или BMP вместо JPEG, чтобы избежать дальнейшего сжатия. Не уверены, одинаковы ли схемы прогнозирования для кодеков JPEG и MPEG.
I-кадр каждый второй кадр необычен для кодека MPEG-4, но вы сказали, что он был плохо закодирован. Кто-то установил либо GOP, т. Е. Интервал ключевого кадра, равный 2, либо очень низкий порог смены сцены, вероятно, первый.
Выглядит хорошо. Знаете ли вы, если `-pix_fmt grey` напрямую соответствует компоненту Y ввода?
slhck 8 лет назад
0
Я так и думал, но, кажется, применен какой-то фильтр - расширение диапазона, похоже. Добавлена прямая команда подъема.
Gyan 8 лет назад
0
Привет, Малвя, спасибо за помощь. Кажется, это работает, но я получаю вывод в моем терминале, который немного беспокоит меня. Выглядит это так: `Длительность в прошлом 0.999992 слишком велика Последнее сообщение повторено 30 раз Длительность в прошлом 0.999992 слишком великаN / A время = 00: 00: 11.36 битрейт = Н / Д скорость = 22.7x Последнее сообщение повторяется 33 раза Длительность в прошлом 0.999992 слишком великаN / Время = 00: 00: 23,48 битрейт = N / A скорость = 23,5x `Повторяется около 20 раз.
Goat-Anti-Rabbit 8 лет назад
0
Игнорируй это. Не имеет значения в выводе.
Gyan 8 лет назад
0