作者:飞儿gxj_505 | 来源:互联网 | 2023-09-15 11:23
我正在尝试使用Gstreamer 0.1转置代码以使用Gstreamer 1.0。在旧版本的代码中(使用Gstreamer 0.1),回调函数(在解码新帧时调用)接收一个缓冲区,该缓冲区具有一个偏移量字段,据我所知,该字段表示帧号。在执行过程中,此偏移量从零开始,并且一直在增长。
在使用Gstreamer 1.0的代码中,接收到的缓冲区还具有一个offset字段,但它不会随时间变化,并且等于任意一个非常高的值。
dts,duration和offset_end字段在高值时也保持恒定,只有pts字段从低值开始并在执行期间增长。
我可能错过了几行代码(Gstreamer 1.0中需要,而Gstreamer 0.1中不需要),但是我找不到哪几行。
有人可以告诉我我在这里想念什么吗?
以下是使用Gstreamer 1.0的版本:
from utils import mksock
class Video():
""" Video stream from RU """
_PIPEDEF=[
"udpsrc name=src blocksize=1316 close-socket=false buffer-size=100000 ",# UDP video data
# "video/mpegts ","tsparse ",# parse the incoming stream to MPegTS
"tsdemux emit-stats=True ",# get pts statistics from the MPegTS stream
"queue ",# build queue for the decoder
# "video/x-h264 ","h264parse ","avdec_h264 max-threads=1 ","identity name=decoded ",# used to grab video frame to be displayed
"fakesink sync=false " # dump video frames from memory after all relevant processing is done
]
_pipeline = None # The GStreamer pipeline
_keepalive = None # Keepalive for video
_sock = None # Communicaion socket
def __init__(self,streamLibs):
[self._Gst,self._Gio,GLib] = streamLibs
def start(self,peer):
""" Start grabbing video """
# Create socket
self._sock = mksock(peer)
# Create G address for sending keepalive msg
Gpeer = self._Gio.Inetsocketaddress.new_from_string(peer[0],peer[1])
# Create G socket using socketfd
self._Gsock = self._Gio.Socket.new_from_fd(self._sock.fileno())
self._Gsock.set_keepalive(True)
# Create pipeline
self._pipeline= self._Gst.parse_launch("!".join(self._PIPEDEF))
# Set socket to get data from out socket
src = self._pipeline.get_by_name("src")
src.set_property("socket",self._Gsock)
# Catch decoded frames
decoded = self._pipeline.get_by_name("decoded")
decoded.connect("handoff",self._decoded_buffer)
# Start video streaming
srcpad = src.get_static_pad("udpsrc")
# Start the video pipeline
self._pipeline.set_state(self._Gst.State.PLAYING)
print 'Succeeded launching video stream pipeline...'
def _decoded_buffer(self,ident,buf):
""" Callback for decoded buffer """
# Make sure to convert timestamp to us
print("Bufer: pts/1000="+str(buf.pts/1000)) #Starts near zero and grows in time
print("dts/1000="+str(buf.dts/1000)) #Stays static at an arbitrary high value
print("duration/1000="+str(buf.duration/1000)) #Stays static at an arbitrary high value
print("offset="+str(buf.offset)) #Stays static at an arbitrary high value
print("offset_end="+str(buf.offset_end)) #Stays static at an arbitrary high value