Здравствуйте!
Я пытаюсь в программе на Qt последовательность QImage преобразовать в YUV-поток
и передать его ffmpeg, чтобы она из него создала avi-файл.
Для этого из содержимого QImage заполняется массив с таким же количеством точек,
по 3 байта на точку, а RGB переводится в YUV. Я смотрел, какие массивы строит
y4mcolorbars, в них 3 байта на точку. Для передачи используется QTcpServer.
Когда происходит соединение с ffmpeg, создаётся QTcpSoket, он передаёт заголовок,
заканчивающийся символом '\n'. Заголовок такой:
YUV4MPEG2 W1280 H1024 F24:1 Ip C444
1280 и 1024 - это размер кадра, соответственно размер массива - 3932160 байтов.
Перед передачей очередного массива этот же сокет передаёт слово FRAME, тоже с '\n',
а затем он передаёт сам массив одной командой и вот после 1-го же массива
соединение разрывается:
Консоль:
Socket error! 1 Удалённый узел закрыл соединение
Socket was disconnected.
Вот скрипт, которым запускается ffmpeg:
#!/bin/bash
# 1st - port number, 2nd - fps
nprt=$1
fps=$2
pprn=${HOME}"/image2avi_3.log"
pprne=${HOME}"/image2avi_3e.log"
rm -f $pprne
touch $pprne
idprn=${HOME}"/ffmpeg_id_3"
fpath=${HOME}"/hard/avi"
fdt=`date +%Y_%m_%d_%H_%M_%S`
flnm=${fdt}_${fps}
fflnm=${fpath}/${flnm}
vcod=libx264
hostn=`hostname`
echo $1 $2 $hostn $nprt $flnm > $pprn
echo 3 <> /dev/tcp/${hostn}/$nprt
/usr/bin/ffmpeg -v error -f yuv4mpegpipe -i 3 -r $fps -vcodec $vcod \
-vpre libx264-ultrafast-old -f avi ${fflnm}_v.avi \
tcp://${hostn}:${nprt}?listen&timeout=12000000 >& $pprne &
piav=`pidof ffmpeg`
echo $piav > $idprn
echo "ffmpeg is running" >> $pprn
Опытным путём было установлено, что констукция
tcp://${hostn}:${nprt}?listen
должна быть последней в команде, т.к всё, что после неё, не воспринимается,
либо я не так это делаю. Например, когда она была после "-i 3", bash сообщал,
что команды "-r" не существует.
При этом avi-файл не создаётся вообще, даже нулевой длины.
Вопросы такие, если кто знает:
Почему соединение разрывается после 1-й же попытки передачи массива?
Можно ли такие большие массивы посылать одной командой?
Правильно ли указан формат при вызове ffmpeg и как надо, если нет?
Т.е. цель - сформировать поток, подобно тому, как это делатет jpeg2yuv
и передать его ffmpeg, чтобы она построила из него avi-файл.
Возможно, не обязательно передавать кадры в формате YUV, а можно и в RGB,
но мне сначала надо добиться, чтобы работало хоть как-то.
Пётр.