diff --git a/birdnet-pi/DOCS.md b/birdnet-pi/DOCS.md index 5571af3c45..5d4b7aa2bb 100644 --- a/birdnet-pi/DOCS.md +++ b/birdnet-pi/DOCS.md @@ -60,7 +60,7 @@ sudo apt-get dist-upgrade -y # Install RTSP server sudo apt-get install -y micro ffmpeg lsof -sudo -s cd /root && wget -c https://github.com/bluenviron/mediamtx/releases/download/v1.9.1/mediamtx_v1.9.1_linux_arm64v8.tar.gz -O - | sudo tar -xz +sudo -s cd /root && wget -c https://github.com/bluenviron/mediamtx/releases/download/v1.18.1/mediamtx_v1.18.1_linux_arm64v8.tar.gz -O - | sudo tar -xz ``` @@ -125,126 +125,6 @@ fi ``` -
-Optional: use gstreamer instead of ffmpeg - -```bash -# Install gstreamer -sudo apt-get update -#sudo apt-get install -y \ -# gstreamer1.0-rtsp \ -# gstreamer1.0-tools \ -# gstreamer1.0-alsa \ -# gstreamer1.0-plugins-base \ -# gstreamer1.0-plugins-good \ -# gstreamer1.0-plugins-bad \ -# gstreamer1.0-plugins-ugly \ -# gstreamer1.0-libav -apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio -y -``` - -Create a script named `rtsp_audio_server.py`: - -```python -#!/usr/bin/env python3 - -import gi -import sys -import logging -import os -import signal - -gi.require_version('Gst', '1.0') -gi.require_version('GstRtspServer', '1.0') - -from gi.repository import Gst, GstRtspServer, GLib - -# Initialize GStreamer -Gst.init(None) - -# Configure Logging -LOG_FILE = "gst_rtsp_server.log" -logging.basicConfig( - filename=LOG_FILE, - filemode='a', - format='%(asctime)s %(levelname)s: %(message)s', - level=logging.DEBUG # Set to DEBUG for comprehensive logging -) -logger = logging.getLogger(__name__) - -class AudioFactory(GstRtspServer.RTSPMediaFactory): - def __init__(self): - super(AudioFactory, self).__init__() - self.set_shared(True) - self.set_latency(500) - self.set_suspend_mode(GstRtspServer.RTSPSuspendMode.NONE) - logger.debug("AudioFactory initialized: shared=True, latency=500ms, suspend_mode=NONE.") - - def do_create_element(self, url): - pipeline_str = ( - "alsasrc device=plughw:0,0 do-timestamp=true buffer-time=2000000 latency-time=1000000 ! " - "queue max-size-buffers=0 max-size-bytes=0 max-size-time=0 ! " - "audioconvert ! " - "audioresample ! " - "audio/x-raw,format=S16BE,channels=2,rate=48000 ! " - "rtpL16pay name=pay0 pt=96" - ) - logger.debug(f"Creating GStreamer pipeline: {pipeline_str}") - try: - pipeline = Gst.parse_launch(pipeline_str) - if not pipeline: - logger.error("Failed to parse GStreamer pipeline.") - return None - return pipeline - except Exception as e: - logger.error(f"Exception while creating pipeline: {e}") - return None - -class GstServer: - def __init__(self): - self.server = GstRtspServer.RTSPServer() - self.server.set_service("8554") - self.server.set_address("0.0.0.0") - logger.debug("RTSP server configured: address=0.0.0.0, port=8554.") - - factory = AudioFactory() - mount_points = self.server.get_mount_points() - mount_points.add_factory("/birdmic", factory) - logger.debug("Factory mounted at /birdmic.") - - self.server.attach(None) - logger.info("RTSP server attached and running.") - -def main(): - server = GstServer() - print("RTSP server is running at rtsp://localhost:8554/birdmic") - logger.info("RTSP server is running at rtsp://localhost:8554/birdmic") - - loop = GLib.MainLoop() - - def shutdown(signum, frame): - logger.info(f"Shutting down RTSP server due to signal {signum}.") - print("\nShutting down RTSP server.") - loop.quit() - - signal.signal(signal.SIGINT, shutdown) - signal.signal(signal.SIGTERM, shutdown) - - try: - loop.run() - except Exception as e: - logger.error(f"Main loop encountered an exception: {e}") - finally: - logger.info("RTSP server has been shut down.") - -if __name__ == "__main__": - if not os.path.exists(LOG_FILE): - open(LOG_FILE, 'w').close() - - main() -``` -
-
Optional: Startup automatically