LINUX.ORG.RU

Самопальный h264 видео-фильтр

 , , , ,


1

1

Нужно прогнать видео-поток (формат h264) через алгоритм обработки изображения. Главный вопрос в том, как достать из avi отдельные кадры (желательно в формате YUV), отправить их своей проге (пусть по одному) и вернуть их на прежнее место (закодировать в тот же или хотя бы lossless h264)?


Ответ на: комментарий от Andrey_Utkin

Я после man avconv устал page down держать (на Jessie нет ffmpeg). Может, кто-нибудь уже сталкивался с задачей вытаскивать из видео фреймы 1 за 1, обрабатывать их и в энкодер отправлять? Вообще, судя по

Before encoding, avconv can process raw audio and video frames using filters from the libavfilter library.

нечто подобное эта утилита должна делать. Но каким образом это можно осуществить с внешним кодом?

aboite
() автор топика

Я себе для этого специальную программу написал ( http://cdslow.org.ru/video3x/ ), которая запускается таким вот скриптом:

#!/bin/sh

FFPROBE=ffprobe
FFMPEG=ffmpeg
X264=x264

if [ '!' -f "$1" -o -z "$2" ]
    then
    echo "Call: $0 input output [filters]"
    exit 1
    fi

FILE="$1"
shift
OUT="$1"
shift

VI3X="vi3x"
[ -x `dirname $0`"/vi3x" ] && VI3X=`dirname $0`"/vi3x"
[ -x "./vi3x" ] && VI3X="./vi3x"

eval `$FFPROBE -show_streams "$FILE" 2>/dev/null | \
    sed -n -e '/codec_type=video/,/\[\/STREAM\]/ p' | \
    grep '^width=\|height=\|r_frame_rate=\|sample_aspect_ratio='`

eval `$VI3X \
    -i "420p:w=${width},h=${height},fps=${r_frame_rate},sar=${sample_aspect_ratio}" \
    -o null -t "$@"`

[ -z "$WIDTH" -o -z "$HEIGHT" ] && exit 1

$FFMPEG -i "$FILE" -an -f rawvideo -vcodec rawvideo pipe: | \
    $VI3X \
        -i "420p:w=${width},h=${height},fps=${r_frame_rate},sar=${sample_aspect_ratio}" \
        -o "420p" "$@" | \
    $X264 --preset faster -q 0 -o "$OUT" --input-res "${WIDTH}x${HEIGHT}" --fps "$FPS" --sar "$SAR" -

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

cdslow ★★
()

А OpenCV вам не подходит?

anonymous
()

Если кому интересно, программа будет осуществлять (цвето)коррекцию видео по нетипичным алгоритмам.

Пока что остановился на avconv/ffmpeg, что «на грязно» выглядит так:

mkfifo originalpipe.temp
mkfifo modifiedpipe.temp

avconv -i /home/user/videofiles/0001_original.avi -an -f yuv4mpegpipe - > originalpipe.temp &
/home/user/myprojects/filter < originalpipe.temp > modifiedpipe.temp &
avconv -i modifiedpipe.temp -vcodec h264 -f avi -y /home/user/videofiles/0001_modified.avi

rm -f modifiedpipe.temp
rm -f originalpipe.temp

Программа /home/user/myprojects/filter работает через стандартный ввод-вывод:

fread(buffer, buffer_size, 1, stdin);
fwrite(buffer, buffer_size, 1, stdout);

aboite
() автор топика
9 мая 2016 г.

Кто-нибудь знает, как закомпрессировать видео точно В ТОТ ЖЕ формат, который был на декомпрессии?

aboite
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.