Release Notes for v3.19.2 (2024.07.11)




[Stop Offscreen Cameras]


In the Settings tab is an option named “Stop Offscreen Cameras”. It was an all-or-nothing mechanism that controlled whether or not an offscreen camera was fully disabled when offscreen, or fully enabled. This has changed. There are three layers when streaming a camera: networking, decoding/encoding/routing (we’ll just call this “routing” for brevity) and displaying. The new behavior is that all offscreen cameras have the top two layers (routing, displaying) disabled. With the Stop Offscreen Cameras option enabled, we also stop the lowest layer (networking), which amounts to fully disabling the camera.


With this change, you can now record offscreen cameras. Event processing (like motion events) will continue to take place for offscreen cameras. This is a stepping stone towards (for instance) being able to have a small set of cameras onscreen, a large set of cameras offscreen, and have cameras with active events move to a position that is on the screen. Also, this means that you can now record a larger number of cameras than your device is capable of decoding and displaying without resorting to the Group “Record” function that eliminates the display functionality entirely. That is still the best bet though if you don’t care to have anything displayed on the screen.


[Camera Recording]


We’ve significantly improved the timing accuracy of recording files. Each file has a timestamp. That timestamp previously represented the time at which the recording file was started. However, given a camera with a keyframe interval of, say, 5 seconds, the actual first frame in that recording file might be several seconds after the time indicated. As of this version, the timestamp used in the file name is based on the timestamp associated with the first frame written to the recording file, which itself is captured at the time the frame is received from the network.


Given a set of cameras all being recorded simultaneously, this should allow for those cameras to be played back in a synchronized fashion (once Streamie supports multiple camera playback).


Interestingly, this improvement is the result of working with a fitness-related startup that’s synchronizing data from a piece of hardware with video frames captured from multiple cameras with Streamie.


[Four Point Oh]


April 2, 2021 we introduced Streamie v3.0. Recent updates have focussed on checking off the last remaining things to achieve v4.0. If this release resolves some recent regressions, then the next release will be the 1st in the four-point-oh series. Woo.




- Ports the Group Configuration view controller to the Screen framework.

- Ports the URL Camera Configure view controllers to the Screen framework.

- Ports the ONVIF Camera Configure view controller to the Screen framework.

- Ports the ONVIF Camera Message view controller to the Screen framework.

- Ports the UniFi Message view controller to the Screen framework.

- Ports the HomeKit Camera Configure view controller to the Screen framework.

- Ports the Attached Camera Configure view controller to the Screen framework.

- Ports the Nest Camera Configure view controllers to the Screen framework.

- Ports the Shared Camera Configure view controllers to the Screen framework.

- Ports the UniFi Camera Configure view controller to the Screen framework.

- Ports the Camera Action Configure view controller to the Screen framework.


- Adds Member nickname support. In the Home ==> Members ==> Member screen, you can assign a nickname to a device that will supersede the real name.

- Adds to StreamingSession the ability to mute source audio. Because we now decode all incoming audio, we can internally mute it by over-writing the decoded audio before it is handed over to the various Sinks. This is used by the YouTube Live Streaming feature instead of generating silent audio and trying to match the timing.

- Adds a sound level indicator when audio is enabled for a streaming camera that shows the volume of the audio on that camera. This replaces the static image we've used forever.

- Adds an Options - Help menu item in the Settings screen so that we can have a How To page for the various options available on that screen.


- Improves the audio handling pipeline in StreamingSession in several ways: (1) Unless a Sink wants the original audio (such as the Recorder), it is always run through a decoder (as with video). Each Audio Session has an encoder to convert the decoded audio to whatever codec its sinks want. This is slightly less efficient than before, in that if a Source provides AAC audio and a Sink wants AAC audio, we no longer do pass-through. The reason for this is to allow us to mute audio by zeroing-out the decoded audio. It also makes the routing a more consistent (like with video). (2) We have split the Streaming Session file into multiple files, one for each of the Source types, plus an AudioSession file and a VideoSession file. The one file was getting so large that Xcode was choking on it.

- Improves the timing accuracy of the timestamp in recorded files which is now based on the time at which the first frame of the recording was received from the network. This also means that there's an extra "-xxx", representing milliseconds, in the name of each recorded file.

- Improves the offscreen camera behavior and performance. With stop-offscreen-cameras disabled, we'll maintain a connection to the camera while disabling decording and displaying.

- Improves the ONVIF Camera Configure screen so that it just refreshes the section footer with the URL instead of reloading the entire connection details section each time a value is modified.

- Improves the ONVIF Camera Configure screen to show the "safeUrl" in the Connect section footer instead of the full url which included the user and pass.

- Improves the URL Camera Configure screen to update the Connect section footer URL whenever a connect section value is changed.

- Improves StreamingSessionTester so that if it fails to grab a snapshot it still returns the StreamInfo instead of just an error.


- Refactors video frame handling so that it is all wrapped up in a CMCEncodedVideoFrame, which is a type we had previously defined and then moved away from; it's back now. This is one step in an effort to be able to precisely synchronize video from multiple cameras in CMCCameraRecorder.

- Strips out of YouTubeService its internal capability of generating silent audio to replace the source audio when a caller wants the audio muted.


- Fixes a tvOS 18 (and presumably iOS 18) video encoding issue related to VTCopyVideoEncoderList() being completely broken now. This change in behavior impacts remote streaming and recording. It should work fine as long as you're using this build (or later).

- Fixes a crash in the Recorder screen if you try to record an unsupported camera type (such as HomeKit).

- Fixes a crash related to VideoToolboxDecoder where it seems that tvOS 18's behavior has changed and we end up calling .leave() multiple times for one .enter(). I've wrapped it in an if-statement to prevent that crash, but it's still unknown what excatly the behavioral change is.

- Fixes a crash that occurs on tvOS due to an infinite value when updating SliderCollectionViewCell.

- Fixes a crash in the UniFi Camera Configure screen when clicking on a placeholder cell.

- Fixes a crash that can occur when startup times out and we try to set ChinstrapService.shared to nil; we were not properly unwrapping shared.

- Fixes a crash that could occur when a Streaming Session stops, if it has queued up snapshot listeners.

- Fixes a crash (but doesn't fix the actual problem) associated with sizeForItemAt() in BaseScreenViewController which was returning a CGSize where the height was NaN.

- Fixes a crash (maybe) in CMCDiscovery.Browser by deallocating the dnssd only when stop() is called. It looks like there might be a leak though, because deinit() was never called when I switched accounts.

- Fixes a crash (maybe) when an event is deleted from another device. Sometimes. Maybe.

- Fixes a crash (maybe) that has eluded me for a long time: I think the issue was hiding the navigation bar when opening a streaming session, but only under very rare circumstances.

- Fixes a crash (maybe) that occurred when playing a recorded file. In lieu of any obvious problems, I'm speculating that an integer overflow happened and we're not checking for that so we can fail gracefully in the face of corrupt data. [DD]

- Fixes a crash (maybe) in the ONVIF Camera Configure screen related to reloading the Streams section. I need to buy some specific Amcrest equipment to better validate this. [BB]

- Fixes a crash in StreamingSession where we were failing the snapshotList during deinit(). I think maybe it needs to be done in the global queue or something, so I'm trying that out now.

- Fixes crashes where we were not bounds-checking to handle users clicking on placeholder cells in various screens.

- Fixes Penguin (the API server) so that it doesn't propagate SQL queries down to the client when errors (like "Record not found") occur.

- Fixes an issue where HomeKit cameras could be used when creating a new Share, even though they are fundamentally incompatible with that due to Apple being Apple.

- Fixes an issue in the Camera Search Screen. When loading cameras from a Google Nest Integration, if any configured Google Nest Integrations fail when loading a list of cameras, then the whole process of loading Google Nest cameras fails. [Gary Grooms]

- Fixes a remote streaming audio issue where the "components" value was not set correctly. There is a larger problem here that we've totally mucked about the use of "components" and "samples" and such and that needs to be cleaned up.

- Fixes some AAC audio encoding and decoding issues.

- Fixes a bug in the Modes ==> Mode ==> Schedule screen where manually dismissing the screen would result in a 2nd "pop" to the navigation stack.

- Fixes an audio/video synchronization issue related to Attached cameras (USB, built-in) that prevented YouTube Live Streaming for working.

- Fixes a the cause of a ton of crashes that occurred when the app was moved to the background while it was still starting up. Whoops.

- Fixes a Ubiquiti compatibility issue related to changes in their Json stuff, again.

- Fixes an issue where we did not call stop() on ChinstrapService during startup if the startup sequence failed.

- Fixes an obnoxious deadlock bug that requires the use of a camera Delay, and then repeatedly starting/stopping a camera. Eventually, stopping the VideoDecoder (which was called within sessionsLock in StreamingSession blocks on the sessionsLock queue, and everything fails after that. [DV]


- Merges the iOS- and tvOS-specific BasicBackgroundView classes into a single class.

- Merges the iOS- and tvOS-specific AboutViewController classes into a single class.


- Changes the UIImage watermark function to use "" instead of "" -- I don't know why it took me so long to realize that needed updating.

- Changes the homeNodeForAccountHash() function to use the built-in Hasher, which hopefully works more consistently than what I had conjured up.

- Changes the Recording Files Screen so that the footer text correctly specifies what the cell items represent when it is just listing files vs when it is displaying snapshots related to event filtering.

- Changes the Control labels when configuring an ONVIF cameras so that they read "Pan Speed", "Tilt Speed" and "Zoom Speed" instead of just "Pan", "Tilt" and "Zoom".

- Changes the remote streaming behavior so that it'll only automatically try a remote stream if there's actually more than one user on the account.


- Removes the "Talk" option from the iOS StreamerViewController, which wasn't supposed to have made it to production. Whoops.



Related Topics


Release Notes


About Streamie


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!