LINUX.ORG.RU

Пересжатие H264 с потерей кадров

 , , ,


0

3

Приветствую.

Опять продолжение темы Запись сырого h264

Теоретический подсчет показал, что в сравнении с raw записью 1920х1080 MJPEG создающую нагрузку на носитель где то 1.2 Мб/c при 5 фпс, такая же запись H264 при 30 фпс создает поток где то 0.6 Мб/c, т.е. в принципе уже проверенную пропускную способность по записи укладываюсь, а вот с онлайн стримом вопрос.

Абсолютно точно придется пропускать кадры. Если для мжпег удалось сделать это очень равномерно, т.к. из очереди std::deque всегда брался для пересжатия из мжпег в х264 только последний кадр, то в случае с h264 нужно занусуть видео поток в канал где то до 2мбит/c, т.е. декодирование->масштабирование в 2-2.5 раза->сжатие. Все это делается на слабенькой arm пока без доступа к ядру гпу.

Первое что приходит в голову это подряд пересжимать кадры и сбрасывать очередь каждый раз при поступлении I кадра - да камера отдает I кадры каждую секунды и еще 29 P кадров, расстояние не большое, но «рывок» в конце каждой секунды все равно хоть как будет и скорее всего придется отбросить 2/3 кадров (по аналогии с мжпег пересжатием в х264).

Буду благодарен любой идее )

★★★

Последнее исправление: wolverin (всего исправлений: 1)

Не вижу требований на latency, так что…

Буду благодарен любой идее

Не страдать фигней и не пропускать кадры. В битрейт влезает? Если нет, просто понизь его.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от t184256

в битрей не влезает, приблизительно в 2-2.5 раза больше он ширины канала.

понятно что пропускать, вопрос как так пропустить чтобы сравнительно гладкое видео получить?

wolverin ★★★
() автор топика
Ответ на: комментарий от DumLemming

и что это даст кроме загрузки цпу? рывок то все равно останется, т.е. из 30 кадров можно считать что пересжать в нужную ширину канала я успею кадров 10.

а стрим онлайновский ессесна, а не какой то видео по интернетам.

wolverin ★★★
() автор топика

есть еще мысль - декодировать все кадры, а для масштабирования и сжатия брать только последний, аднака попробовал через

ffprobe -show_frames

оценить нагрузку декодера и получилось от 50 до 75% на цпу, т.е. все кадры декодировать тоже не успею

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

ты сначала померяй размер I фреймов и остальных и прикинь, за какой размер ты борешься.

Если у тебя I frame половину от общего битрейта, а остальное размазано на 50% и ты хочешь сделать в три раза меньше fps, то ты сэкономишь 1/6, превратив изображение в драный мусор.

Гораздо больше результата будет, если ты просто поставишь обычный нюк и тупо перекодируешь видео с помощью libx264 в два раза меньший битрейт.

max_lapshin ★★★★★
()
Ответ на: комментарий от max_lapshin

max_lapshin

I кадры 140-145 Кб (не совсем показательно, т.к. в тесте снимаю потолок)

P кадры 13-15Кб (те же условия)

Битрейт сколько usb камера отдает не знаю, но VLC показывает до 5мбит/c

а что такое нюк?

ты хочешь сделать в три раза меньше fps

это следствие уже, главное меньше разрешение и естественно меньше битрейт

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 3)
Ответ на: комментарий от max_lapshin

Видимо речь про intel nuc - нет это догага ) тысячи железок же у меня

Может mali удастся нагрузить, но пока не до этого разобраться как аппаратный кодек в свежий ффмпег перенести

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

У большества USB камер можно выбирать FPS.
03f0:e807 HP, Inc HP Webcam HD 4310

[0]: 'YUYV' (YUYV 4:2:2)
        Size: Discrete 1280x720
                Interval: Discrete 0.133s (7.500 fps)
        Size: Discrete 1920x1080
                Interval: Discrete 0.200s (5.000 fps)
        Size: Discrete 640x480
                Interval: Discrete 0.033s (30.000 fps)
                Interval: Discrete 0.040s (25.000 fps)
                Interval: Discrete 0.050s (20.000 fps)
                Interval: Discrete 0.067s (15.000 fps)
                Interval: Discrete 0.100s (10.000 fps)
                Interval: Discrete 0.133s (7.500 fps)
[1]: 'MJPG' (Motion-JPEG, compressed)
        Size: Discrete 1920x1080
                Interval: Discrete 0.033s (30.000 fps)
                Interval: Discrete 0.040s (25.000 fps)
                Interval: Discrete 0.050s (20.000 fps)
                Interval: Discrete 0.067s (15.000 fps)
                Interval: Discrete 0.100s (10.000 fps)
                Interval: Discrete 0.133s (7.500 fps)
        Size: Discrete 640x480
                ...
                Interval: Discrete 0.033s (30.000 fps)
                Interval: Discrete 0.040s (25.000 fps)
                Interval: Discrete 0.050s (20.000 fps)
                Interval: Discrete 0.067s (15.000 fps)
                Interval: Discrete 0.100s (10.000 fps)
                Interval: Discrete 0.133s (7.500 fps)

046d:0825 Logitech, Inc. Webcam C270

[0]: 'YUYV' (YUYV 4:2:2)
        Size: Discrete 1280x960
                Interval: Discrete 0.133s (7.500 fps)
                Interval: Discrete 0.200s (5.000 fps)
[1]: 'MJPG' (Motion-JPEG, compressed)
        Size: Discrete 1280x960
                Interval: Discrete 0.033s (30.000 fps)
                Interval: Discrete 0.040s (25.000 fps)
                Interval: Discrete 0.050s (20.000 fps)
                Interval: Discrete 0.067s (15.000 fps)
                Interval: Discrete 0.100s (10.000 fps)
                Interval: Discrete 0.200s (5.000 fps)

Это 10% от всех размеров.

Есть правда 1871:0141 Aveo Technology Corp. Camera

        Size: Discrete 640x480
                Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 160x120
                Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 320x240
                Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 176x144
                Interval: Discrete 0.033s (30.000 fps)
        Size: Discrete 352x288
                Interval: Discrete 0.033s (30.000 fps)

Тут дела похуже.

IIIypuk ★★★
()

Разрешение понизь и растяни до нужного. Я некоторые фильмы смотрю в 360p так это 360p аккуратно закодировано так что смотреть приятнее чем 1080p и без квадратиков дохлого битрейта и без дрыгалы пропуска кадров.

anonymous
()
Ответ на: комментарий от IIIypuk

IIIypuk

$ sudo v4l2-ctl --list-formats-ext -d 0
ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'YUYV'
        Name        : YUYV 4:2:2
                Size: Discrete 640x360
                        Interval: Discrete 0.033s (30.000 fps)

        Index       : 1
        Type        : Video Capture
        Pixel Format: 'MJPG' (compressed)
        Name        : Motion-JPEG
                Size: Discrete 640x360
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.033s (30.000 fps)

        Index       : 2
        Type        : Video Capture
        Pixel Format: 'H264' (compressed)
        Name        : H.264
                Size: Discrete 640x360
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.033s (30.000 fps)

wolverin ★★★
() автор топика
Ответ на: комментарий от anonymous

Разрешение понизь и растяни до нужного.

вопрос не в том, какой должен быть готовый поток, а как его получить - есть I кадры каждую секунду, есть P кадры по 29 раз в секунду, каждый P кадр зависит от предыдущего, чтобы восстановить ОНЛАЙН трансляцию для пересжатия требуется ВСЕ кадры декодировать, что невозможно сделать за 33мс на кадр на имеющемся оборудовании.

wolverin ★★★
() автор топика
Ответ на: комментарий от anonymous

в аниме 8-12 кадров в секунду

больше скажу, если я возьму с камеры мжпег 30 фпс при 1920х1080, то я без проблем получу 10 фпс в х264 при разрешении 960х540, НО хочется ОДНОВРЕМЕННО писать х264 с разрешением 1920х1080 т.к. это дает БЕЗ нагрузки в два раза меньший объем хоть и 30 фпс придется писать, а не 5 в случае с мжпег

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

и пока что реалистичным выглядит - декодить все кадры подряд складывая в какую то хитрую очередь пока на декодер не поступит I кадр, после которого для кодера выбрасывать все кадры до него и начинать с начала, т.е. обрезать все что не успело пересжать в конце каждой секунды

зы. если декодер не будет успевать, то еще одна хитрая очередь со сжатыми кадрами полученными с камеры, которые парсятся на определение типа полученного кадра - если I выкидываем все из очереди декодера.

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 2)
Ответ на: комментарий от wolverin

и тогда теоретически станет по барабану сколько фпс отдает камера, т.к. будет ограничено производительностью железки и частотой I кадров.

wolverin ★★★
() автор топика