pub struct RtspSink { /* private fields */ }Expand description
Publishes one compressed packet stream to an already-running RTSP server.
RtspSink::open performs the RTSP ANNOUNCE/SETUP/RECORD
handshake through FFmpeg, so the server must already be listening at
url and must permit publishing to that path. The server can be
MediaMTX or any other implementation that accepts RTSP publishing;
this element does not start, stop, or otherwise depend on a particular
server process.
This is a remuxing sink, not an encoder. Incoming buffers must be
compressed MediaBuffer::Packet values whose codec parameters and
time base match the values passed to RtspSink::open. Place a
crate::elements::Pacer upstream when publishing packets from a file,
otherwise the file will be sent faster than real time.
The current sink publishes one stream. Build separate sinks and RTSP paths when publishing independent streams.
Implementations§
Source§impl RtspSink
impl RtspSink
Sourcepub fn open(
name: impl Into<String>,
url: impl Into<String>,
transport: RtspTransport,
params: Parameters,
time_base: Rational,
) -> Result<Self>
pub fn open( name: impl Into<String>, url: impl Into<String>, transport: RtspTransport, params: Parameters, time_base: Rational, ) -> Result<Self>
Connects to url and starts publishing.
params and time_base must describe every packet subsequently
passed to Sink::consume. TCP is the most reliable transport for
general networks; UDP is useful when the network path and server
permit the negotiated RTP/RTCP ports.
Trait Implementations§
Source§impl Element for RtspSink
impl Element for RtspSink
Source§fn name(&self) -> Arc<str> ⓘ
fn name(&self) -> Arc<str> ⓘ
crate::bus::BusEvent stores names as
Arc<str> for exactly this reason: a hot path like
crate::queue::Queue posting BusEvent::Dropped once per
overflowed buffer shouldn’t pay for a fresh heap allocation every
time it wants to report which element it is.Source§fn element_type(&self) -> ElementType
fn element_type(&self) -> ElementType
ElementType.Source§fn pp_log(&self) -> &PpLog
fn pp_log(&self) -> &PpLog
crate::bus::Bus::post — same
id/name as Element::name, just already wrapped as the
crate::pp_log::PpLog its pp_info!/pp_warn!/pp_error! macros need. A
stored private field, not built fresh per call, for the same reason
name() returns a cheap Arc<str> clone instead of a fresh String
— see its own docs.Source§fn pp_log_mut(&mut self) -> &mut PpLog
fn pp_log_mut(&mut self) -> &mut PpLog
Element::pp_log reads — used by
crate::pipeline::ChainBuilder to stamp the owning
crate::pipeline::Pipeline’s id onto every element that
passes through it, via element_pp_log. Not meant to be called
from anywhere else.Source§impl Sink for RtspSink
impl Sink for RtspSink
fn consume(&mut self, buf: MediaBuffer) -> Result<()>
Source§fn control(&mut self, msg: ControlMsg) -> Result<()>
fn control(&mut self, msg: ControlMsg) -> Result<()>
ControlMsg (pause/resume/stop) and, for anything
with a downstream of its own, forwards it on — same shape as
consume, just a separate channel from MediaBuffer so it can
reach every element (not just ones that already know how to
interpret a data buffer) and, at a crate::queue::Queue, jump
ahead of whatever data is backed up instead of waiting behind it.
No default: every Sink has to consciously decide what this means
for it, rather than silently dropping it.