Ошибка «первый кадр не ключевой» на gstreamer с плагином ffmpeg H263 на gstreamer - PullRequest
1 голос
/ 01 марта 2012

Сейчас я пытаюсь использовать gstreamer для потоковой передачи живого видео между двумя ПК с Windows в высокоскоростной локальной сети. У меня есть пара скриптов, которые я взял из примеров в исходном коде gstreamer и немного изменил. Они используют H263p для видеокодека, speex для аудиокодека и rtp для отправки потоков по UDP. Все работает отлично, за исключением того, что видеопоток иногда мигает зеленым, прежде чем вернуться к обычному макроблоку за раз. Эти зеленые вспышки сопровождаются этим сообщением об ошибке:

ERROR ffmpeg .:0:: warning: first frame is no keyframe

Это скрипт, который я запускаю на сервере (на самом деле это скрипт Windows; он использует синтаксис BASH, потому что я запускаю его через MSYS):

#!/bin/sh
#
# A simple RTP server
#
# change these to change the server sync. This causes the server to send the
# packets largly out-of-sync, the client should use the RTCP SR packets to
# restore proper lip-sync between the streams.
AOFFSET=0
VOFFSET=0

VCAPS="video/x-raw-yuv,width=352,height=288,framerate=15/1"

#DEST=192.168.1.126
DEST=localhost


gst-launch -v gstrtpbin name=rtpbin \
           ksvideosrc ! videorate ! ffmpegcolorspace ! $VCAPS ! ffenc_h263p bitrate=600000 ! rtph263ppay ! rtpbin.send_rtp_sink_0      \
                     rtpbin.send_rtp_src_0 ! queue ! udpsink host=$DEST port=5000 ts-offset=$AOFFSET      \
                     rtpbin.send_rtcp_src_0 ! udpsink host=$DEST port=5001 sync=false async=false         \
                     udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0                                           \
           directsoundsrc ! audioconvert ! speexenc ! rtpspeexpay ! rtpbin.send_rtp_sink_1                         \
                 rtpbin.send_rtp_src_1 ! queue ! udpsink host=$DEST port=5002 ts-offset=$VOFFSET      \
                 rtpbin.send_rtcp_src_1 ! udpsink host=$DEST port=5003 sync=false async=false         \
                     udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1

И это скрипт, который выполняется на клиенте

#!/bin/sh
#
# A simple RTP receiver 
#

VIDEO_CAPS="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-1998"
AUDIO_CAPS="application/x-rtp,media=(string)audio,clock-rate=(int)44100,encoding-name=(string)SPEEX"

VIDEO_DEC="rtph263pdepay ! ffdec_h263"
AUDIO_DEC="rtpspeexdepay ! speexdec"

VIDEO_SINK="ffmpegcolorspace ! d3dvideosink"
AUDIO_SINK="audioconvert ! audioresample ! directsoundsink"

gst-launch -v gstrtpbin name=rtpbin latency=100                                    \
           udpsrc caps=$VIDEO_CAPS port=5000 ! rtpbin.recv_rtp_sink_0              \
             rtpbin. ! $VIDEO_DEC ! $VIDEO_SINK                                \
           udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0                              \
           rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false       \
       udpsrc caps=$AUDIO_CAPS port=5002 ! rtpbin.recv_rtp_sink_1              \
             rtpbin. ! $AUDIO_DEC ! $AUDIO_SINK                                \
           udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1                              \
          rtpbin.send_rtcp_src_1 ! udpsink port=5007 sync=false async=false

Я перепробовал все, что мог придумать, но ничего не сделал, чтобы решить эту проблему. У кого-нибудь есть идеи?

...