First, a big “thank you” to all of the Streamie users who got in touch during this release cycle with bug reports and feature ideas. Getting feedback from users is essential to keeping everything working smoothly.
So, what’s notable in this release?
E-911 — I’ve started work on E-911 integration. It’ll be another release-or-two until this is ready for prime time though.
YouTube Live Stream Quality — You can choose a video quality when configuring a YouTube Integration.
Google Nest + YouTube — I broke Google Nest support for YouTube live streaming, and that is fixed again in this release. Sorry.
Miscellaneous — There are many, many small improvements, such as better audio codec support, user interface issues, ONVIF camera authentication, Apple TV integration with iPhone cameras, additional caching for faster camera access, and so on.
Streamie now has a fallback upload mechanism. I noticed that sometimes devices would fail to upload debug logs (or other files). Of course, if the device won't upload the debug logs, I have little to help me debug. I hypothesized that maybe "stuff" caused the file upload to be blocked. As a new fallback mechanism, if the primary method failed, we could chunk the file up and send it via the persistent API connection. Not ideal, but better than losing data. This worked great in a contrived testing situation, but when running on a prod server, the secondary mechanism was never invoked, and the upload didn't succeed, which means that as far as Streamie was concerned, the primary mechanism must have succeeded. Bedrock. I tracked the dumb bug down to Bedrock (the distributed database). I'm 99% ready to migrate off it. It takes upwards of two seconds for a new write to be readable. The upload was being initiated, row written, upload completed and finalized, before Bedrock could successfully read back the associated row. Finding no related row, the whole upload is scrapped and purged. I still need this new upload mechanism so that Streamie can post snapshots directly to the API server for AI image classification purposes (a feature still in the "messing around" stage), so the work was not entirely without value.
What’s coming next?
AI — We’ve been toying around with some server-side image classification options that look promising. There are some interesting ways to integrate this, but nothing has been decided.
E-911 — We continue to chip away at this feature.
Two-Way Talk — This is an ongoing effort that will hopefully soon show some positive results (besides strange growling sounds coming from the camera).
- Fixes the process that VideoToolboxEncoder uses to find an appropriate codec when the caller does not dictate the codec. Basically, on an Apple TV 5,3 (and presumably other devices), the latest version of tvOS will strangely allow VTCompressionSession() to succeed even if the device does not support encoding with the given codec. So, now we get a list of available codecs and choose the best option from that list. Interestingly, this problem didn't exist in tvOS 14.6, but it does with tvOS 17.1. Maybe they added software encoding support at some point, but don't fully support whatever options we've specified?
- Streamie now has a fallback upload mechanism, which might be largely unnecessary, but it'll be at least slightly useful when trying to do AI image classification prototyping.
- v3.14.2 (which a few of you still use) is gradually being deprecated. Specifically, there's an older method that Streamie used for writing debug logs, camera snapshots, etc., and that no longer has server-side support, so go ahead and let your devices update. Please.
- Updates the Configure S3 (and SMB) FileServer screen to have separate sections for Output Type and Quality Type, removing them from the Options section.
- Extends the StreamingSession.Quality type to include very low, very high and original. We'll use "original" now to indicate "don't transcode" instead of "high".
- Updates the YouTube Integration screen with a new Quality selector. This way, we can force transcoding so that Overlays will work with .h264 video sources. Specifically, this now allows Overlay to be compatible with YouTube live streaming Google Nest cameras.
- Updates FileServer to use .original quality instead of .high quality, by default.
- I messed around with the bit rates for each Quality type, so a Chinstrap Stream now default to .low instead of .medium.
- Fixes a double-pop issue when switching accounts.
- Adds a background color indicator to the YouTube logo when live streaming, that shows the stream health. Black = unknown, Red = bad, Yellow = ok, Green = good.
- Fixes a tvOS usability issue with selection vs focus highlighting. The former is now a background color instead of both being a border color, which was awful.
- Improves the YouTube Integration screen with new Title and Description fields with $value support for inserting dynamic content like $camera and $longdate.
- Disables the "push" functionality in CameraRecorder when a YouTube live stream is running because they don't seem to play well together from a bandwidth perspective.
- Improves the YouTube Live Streaming UI by prompting to stop the live stream, and now you can also "Copy Link" (at least on iOS).
- Improves the YouTube Integration screen by moving the Privacy option to a new Privacy section.
- Fixes a CamerasSearchScreen issue where we were not correctly comparing an ONVIF Source's device address to the ONVIF Service's ONVIF address (we were not taking into account nils).
- Adds support for push logs via the API connection when pushing logs via redirect fails. It's just a stab in the dark that this will fix whatever issue this user was experiencing with pushing logs. [JB}
- Removes the deprecated (in v3.14.2) support for writing logs. Upgrade already!
- Fixes an issue in OnvifService where matchesAddress() assuming two nil values should be a match, which might have made sense at one point (maybe?), but is clearly wrong.
- When connecting to an ONVIF camera, if the device we connect to has a different device address than what the source expected, we update the source to match. The typical use case here is that you created the ONVIF source manually, and now we can fill in the device address.
- Changes NestStreamingSession so that it can better handle reconnections while providing a consistent video presentation time.
- Changes AudioToolboxGenerator to emit packets that are smaller than what the the Converter needs when creating AAC output (1,024 frames per packet), because the Converter was doing weird stuff when that wasn't the case.
- Changes AudioToolboxGenerator to send 0xFFs instead of zeroes for the silent audio stream, because apparently that's important.
- Updates NestStreamingSession to not start the audio generator until it receives the first video frame, and then we use the timestamp from the video frame as the initial timestamp for the audio generator. This failure prevented the audio/video synchronization in YouTubeService from ever succeeding. [AD]
- Replaces the truly awful focus control UI in Streamie-iOS with a duplicate of the volume UI which is vastly superior.
- Fixes a new Streamie crash related to libxml2 memory handling, which apparently is not thread safe, and I've been making CMCOnvifService increasingly concurrent, which made this issue appear. Now, use of verifySystemDateAndTime() is serialized. Subsequent calls to it while one is "in flight" will just wait on the outcome of the first call. Additional changes include getting rid of the reuse of CMCOnvifSecurityHeader, because it needed to be modified for each request (due to WSSE stuff), but if you had multiple concurrent requests, that was bad news bears.
- Fixes the Streamie "clicking sound" heard when YouTube live streaming the Hikvision PTZ camera while configured to use HPCM(48_000). The issue is that CMCStreamingSession was incorrectly making an intermediate conversion from HPCM to PCM because my use of the "!=" overload comparing a CMCStreamingSession.AudioCodec with a CMCAudioCodec was broken. [CCPC]
- Fixes an issue related to remote streaming audio where we need to calculate the number of frames in the packet because we're not sending that information via Chinstrap, which is stupid.
- Hopefully improves the behavior of the push-logs process. There was an async task (rotate logs) that we weren't waiting on, and now we are.
- Updates the Chinstrap remote connection process. Previously we just tried each mapping once, but there are different connection methods available for each mapping (local, direct, reverse), so we need to try all appropriate methods for each available mapping, and that's what we do now. Also, I've swapped reverse-connect to precede direct-connect for the moment, but I'll probably swap that back.
- Added some initial work towards supporting E-911 integration with motion alerts and other events.
- Improves the Chatter-based Relay mechanism to use a generic request instead of having to support each module type, and for each module type to have to enumerate each request type.
- Fixes a Streamie bug related to reverse connect requests, where apparently reverseRequest-v2 was not being handled.
- Updates the StreamerViewController to use the new "button stack" for the audio-on and now youtube-on states. They'll show up on the bottom-right of the streamer screen when active.
- Changes OnvifService to work with an internal cache. We'll see what terrors this change brings about. You know the job about the "two most difficult problems in computer science", right?
- Maybe improves how audio/video sync happens when the RTSP stream doesn't initially provide a Sender Report. I need to augement this by adjusting the synchronization as SRs are received throughout the stream.
- Fixes an Overlay issue where choosing an overlay would wreck the associated streaming group by replacing all of the existing sources of the group with the one chosen overlay. Whoops.
- Adds Attached camera support to tvOS 17+.
- Fixes a bug where when deleting a member from an account, we'd try to reload that member (?!) which would cause an error dialog to appear right as we pop to the Members screen, causing UI havoc. [BG]
- Includes some work trying to get two-way talk functioning, thus far not successfully. This includes the addition of a 3rd party library, twoLAME, which does MP2 encoding.
- Media sections of an SDP can include multiple RTPMAP entries, and I've adjusted the data model to reflect that while continuing to assume for RECVONLY media that we will only work with the first entry. This is a step towards two-way talk functionality.
- Based on user feedback, remotely telling Streamie to start streaming something that it is already streaming, will no longer first stop streaming it and then start streaming it. [BG]
- Improves ONVIF WSSE authentication support, which can be challenging when cameras incorrectly calculate their DST time. Also, we were using getCapabilities() as our test to verify authentication, but it turns out some cameras allow un-authenticated access to that ONVIF request. So, we now do getCapabilities() and getProfiles().
Streamie provides a best-in-class user experience on your iPhone, iPad, Apple TV and Apple Silicon Mac, with an intuitive user interface that makes it simple to discover, stream, record, monitor and share your HomeKit, Google Nest, Ubiquiti UniFi Protect and ONVIF-compatible IP and RTSP cameras. Streamie keeps you informed with motion event notifications and it works with most cameras using its advanced audio and video codec support. You can watch your cameras from anywhere, record 24/7 to your private NAS, remotely manage multiple locations, device permissions and seamlessly synchronize settings across your devices; configure Hubitat smart home automations, live stream to YouTube and rely on the in-app technical support system when you need help (but you can also reach us by phone). Download Streamie today. Lastly, Streamie is solar powered!