现在,我正在尝试使用gstreamer在高速LAN上的两台Windows PC之间传输实时视频。我从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
我已经尝试了我能想到的一切,但我所做的就是解决这个问题。有没有人有任何想法?