{"id":1723,"date":"2017-04-30T12:10:17","date_gmt":"2017-04-30T20:10:17","guid":{"rendered":"https:\/\/chriscarey.com\/wp\/?p=1723"},"modified":"2019-06-26T09:58:30","modified_gmt":"2019-06-26T17:58:30","slug":"achieving-high-frame-rate-with-a-raspberry-pi-camera-system","status":"publish","type":"post","link":"https:\/\/chriscarey.com\/blog\/2017\/04\/30\/achieving-high-frame-rate-with-a-raspberry-pi-camera-system\/","title":{"rendered":"Achieving high frame rate with a Raspberry Pi camera system"},"content":{"rendered":"<p><a href=\"https:\/\/chriscarey.com\/wp\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-camera-case.jpg\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1756\" data-permalink=\"https:\/\/chriscarey.com\/blog\/2017\/04\/30\/achieving-high-frame-rate-with-a-raspberry-pi-camera-system\/raspberry-pi-zero-camera-case\/\" data-orig-file=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-camera-case.jpg\" data-orig-size=\"1696,1306\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"raspberry pi zero camera case\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-camera-case-300x231.jpg\" data-large-file=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-camera-case-1024x789.jpg\" class=\"alignnone size-medium wp-image-1756\" src=\"https:\/\/chriscarey.com\/wp\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-camera-case-300x231.jpg\" alt=\"\" width=\"300\" height=\"231\" srcset=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-camera-case-300x231.jpg 300w, https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-camera-case-768x591.jpg 768w, https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-camera-case-1024x789.jpg 1024w, https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-camera-case.jpg 1696w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>When you read about using Raspberry Pi cameras as part of your home security system, most of the information you will find will point you in the direction of running <a href=\"http:\/\/www.lavrsen.dk\/foswiki\/bin\/view\/Motion\/WebHome\" target=\"_blank\" rel=\"noopener noreferrer\">motion<\/a> which is the de-facto standard for doing video motion detection on Linux. There are also variants of motion such as <a href=\"https:\/\/github.com\/ccrisan\/motioneye\/wiki\" target=\"_blank\" rel=\"noopener noreferrer\">MotionEye<\/a> or <a href=\"https:\/\/github.com\/ccrisan\/motioneyeos\/wiki\" target=\"_blank\" rel=\"noopener noreferrer\">motionEyeOS<\/a> which provide a nicer UI on top of motion.<\/p>\n<p>Motion requires some horsepower to handle the video processing to detect motion, and also to run the web server and other features. On the modest hardware on the Raspberry Pi, I was only able to reliably achieve 4-10 frames-per-second at 800&#215;600, depending on the Raspberry Pi model in use.<\/p>\n<p><strong>Using this technique below, my camera system is now able to get closer to the full resolution for each Raspberry Pi camera which is 1920&#215;1080 at 30 frames per second &#8211; and reliably running for years without issue.<br \/>\n<\/strong><\/p>\n<p><!--more--><\/p>\n<h2>The problem with using motion on the Raspberry Pi<\/h2>\n<p>After much experimentation and time trying to make it work, I found the motion solution is not that great in practice. I have spent countless hours writing scripts, web pages, and various hacks to build a robust 4 camera home security system using this setup.<\/p>\n<p>The cameras suffered from low frame rate (FPS), high load average, frequent lockups, and SD cards dying. This slow frame rate is due to the high CPU needed by motion performing image processing on the low powered Pi. The high load average and SD card death is being caused by the high number of writes (images and video files) on the SD card.<\/p>\n<p>Managing all the video files was a problem as well. Files from the multiple cameras need to be remotely viewable in one central location. The SD card fills up fast and old files need to be deleted to make room for new files.<\/p>\n<p>There has to be a better way!<\/p>\n<h2>The Solution<\/h2>\n<p>The solution I found was to take as much of the processing off of the Raspberry Pis as possible. I wanted to get the devices to send video, and not write anything on the local SD card. The image processing \/ motion detection needs to be removed from the Pi and moved to a more powerful machine.<\/p>\n<h4>The NVR software I went with<\/h4>\n<p>For your camera server, you could choose any NVR hardware or software which supports the RTSP standard for video streams.<\/p>\n<p>In my case I had an old Mac Mini in the closet, and went on the hunt for software that would work on MacOS. After some research, I came across a software called <a href=\"https:\/\/www.bensoftware.com\/securityspy\/\" target=\"_blank\" rel=\"noopener noreferrer\">SecuritySpy<\/a> from Ben Software. This software provides so many capabilities that I was attempting to create myself and now I am a huge fan of it. For the purpose of this article I will go through how I set up SecuritySpy, but you can use any video recording software that you want.<\/p>\n<p>SecuritySpy is a paid software and is totally worth the price for the features and support that you get.<\/p>\n<h2>Configure the Raspberry Pi camera to be a RTSP streaming server<\/h2>\n<p>Set up the Pi camera according to the camera setup guide. You need to run <strong>raspi-config<\/strong> and enable the camera module.<\/p>\n<p>This technique uses the software <strong>raspivid<\/strong> and the VLC command line interface <strong>cvlc<\/strong>. raspivid should already be installed with your Raspbian install, but you will probably need to install VLC:<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">sudo apt-get install vlc<\/div><\/div>\n<p>Create a script to turn your Raspberry Pi into a RTSP streaming server. In the pi home directory \/home\/pi, create the file <strong>stream-rtsp.sh<\/strong>:<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">#!\/bin\/bash<br \/>\nraspivid -o - -t 0 -w 1920 -h 1080 -fps 30 -b 250000 | cvlc -vvv stream:\/\/\/dev\/stdin --sout '#rtp{access=udp,sdp=rtsp:\/\/:8554\/stream}' :demux=h264<\/div><\/div>\n<p>Tweak the settings to your liking. The -w width -h height -fps fps -b bitrate are good values to play with.<\/p>\n<p>I sometimes run on a lower configuration to reduce network bandwidth:<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">#!\/bin\/bash<br \/>\nraspivid -o - -t 0 -w 1000 -h 576 -fps 20 -b 250000 | cvlc -vvv stream:\/\/\/dev\/stdin --sout '#rtp{access=udp,sdp=rtsp:\/\/:8554\/stream}' :demux=h264<\/div><\/div>\n<p>With this simple script, your Pi will be running as a RTSP server listening on both TCP and UDP. Remove access=udp to disable the UDP stream if you want. My suggestion is to leave both enabled, and see which one works best for you.<\/p>\n<p>Make the script executable:<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">chmod +x stream-rtsp.sh<\/div><\/div>\n<p>Test the script by running it manually:<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">.\/stream-rtsp.sh<\/div><\/div>\n<h3>Making the script run on startup<\/h3>\n<p>After you see it is working, set up the script to run automatically on startup. I have two examples of how to do this here. First is using a systemd startup script which is recommended. Second is inside of a screen session. You only need to choose one option.<\/p>\n<h4>Script startup Option 1 &#8211; systemd startup script<\/h4>\n<p>Create the file \/etc\/systemd\/system\/stream-rtsp.service<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">[Unit]<br \/>\nDescription=auto start stream<br \/>\nAfter=multi-user.target<\/div><\/div>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">&lt;code&gt;<\/div><\/div>\n<p><\/code><\/p>\n<p>[Service]<br \/>\nType=simple<br \/>\nExecStart=\/home\/pi\/stream-rtsp.sh<br \/>\nUser=pi<br \/>\nWorkingDirectory=\/home\/pi<br \/>\nRestart=on-failure<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">&nbsp;<\/div><\/div>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">[Install]<br \/>\nWantedBy=multi-user.target<\/div><\/div>\n<p>Set the service to auto start<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">sudo systemctl enable stream-rtsp.service<\/div><\/div>\n<p>Then you can start, stop, or check on the service with:<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">sudo systemctl start stream-rtsp.service<br \/>\nsudo systemctl stop stream-rtsp.service<br \/>\nsudo systemctl status stream-rtsp.service<\/div><\/div>\n<h4>Script startup Option 2 &#8211; Using screen<\/h4>\n<p>As a reminder, you do not need to do this part if you did the systemd startup script above.<\/p>\n<p>Install screen<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">sudo apt-get install screen<\/div><\/div>\n<p>To make screen start every boot, add this to the middle of your \/etc\/rc.local file (above exit 0):<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\"># start streaming video<br \/>\nsu - pi -c &quot;\/usr\/bin\/screen -dmS stream \/home\/pi\/stream-rtsp.sh&quot;<\/div><\/div>\n<p>Note: When using this method the stream-rtsp script will NOT auto restart if for some reason it crashes. That it one benefit in using systemd. Easiest is to just reboot the box.<\/p>\n<h2>Option 1 for NVR &#8211; Using SecuritySpy<\/h2>\n<h2>Download, Install and set up SecuritySpy<\/h2>\n<p><a href=\"https:\/\/www.bensoftware.com\/securityspy\/download.html\" target=\"_blank\" rel=\"noopener noreferrer\">SecuritySpy download page<\/a><\/p>\n<p>Some of the features SecuritySpy provides:<\/p>\n<p>&#8211; Live Video with FPS overlay<br \/>\n&#8211; Constant recording, or motion detection recording<br \/>\n&#8211; A robust interface for viewing recorded videos<br \/>\n&#8211; Web based interface for viewing on computer, phone, TV<br \/>\n&#8211; iOS client for live viewing on iPhone, iPad, AppleTV<br \/>\n&#8211; Automatic deletion of old video files (by age, or when the hard drive fills)<br \/>\n..and much more<\/p>\n<p>Add a new camera in the SecuritySpy setup.<\/p>\n<p>Enter the Raspberry Pi camera IP address. Select &#8220;Profile&#8221; &#8220;Manual configuration&#8221;, &#8220;Format&#8221; &#8220;RTSP TCP (video and audio)&#8221;, and down in &#8220;Request&#8221; enter &#8220;\/stream&#8221;.<\/p>\n<p><a href=\"https:\/\/chriscarey.com\/wp\/wp-content\/uploads\/2017\/04\/SecuritySpy-camera-config.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1731\" data-permalink=\"https:\/\/chriscarey.com\/blog\/2017\/04\/30\/achieving-high-frame-rate-with-a-raspberry-pi-camera-system\/securityspy-camera-config\/\" data-orig-file=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/SecuritySpy-camera-config.png\" data-orig-size=\"813,694\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"SecuritySpy camera config\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/SecuritySpy-camera-config-300x256.png\" data-large-file=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/SecuritySpy-camera-config.png\" class=\"alignnone size-full wp-image-1731\" src=\"https:\/\/chriscarey.com\/wp\/wp-content\/uploads\/2017\/04\/SecuritySpy-camera-config.png\" alt=\"\" width=\"813\" height=\"694\" srcset=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/SecuritySpy-camera-config.png 813w, https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/SecuritySpy-camera-config-300x256.png 300w, https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/SecuritySpy-camera-config-768x656.png 768w\" sizes=\"auto, (max-width: 813px) 100vw, 813px\" \/><\/a><\/p>\n<p>Apply Preferences, then the video should show up.<\/p>\n<p><a href=\"https:\/\/chriscarey.com\/wp\/wp-content\/uploads\/2017\/04\/securityspy-one-camera.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1759\" data-permalink=\"https:\/\/chriscarey.com\/blog\/2017\/04\/30\/achieving-high-frame-rate-with-a-raspberry-pi-camera-system\/securityspy-one-camera\/\" data-orig-file=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/securityspy-one-camera.png\" data-orig-size=\"866,540\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"securityspy one camera\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/securityspy-one-camera-300x187.png\" data-large-file=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/securityspy-one-camera.png\" class=\"alignnone size-full wp-image-1759\" src=\"https:\/\/chriscarey.com\/wp\/wp-content\/uploads\/2017\/04\/securityspy-one-camera.png\" alt=\"\" width=\"866\" height=\"540\" srcset=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/securityspy-one-camera.png 866w, https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/securityspy-one-camera-300x187.png 300w, https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/securityspy-one-camera-768x479.png 768w\" sizes=\"auto, (max-width: 866px) 100vw, 866px\" \/><\/a><\/p>\n<h2>Option 2 for NVR &#8211; Monitor the camera with any NVR software of your choosing<\/h2>\n<p>The important part here is that we configured the Raspberry Pi to run a <strong>RTSP<\/strong> server which accepts connections over <strong>TCP or UDP<\/strong> on port <strong>8554<\/strong> and the request url is <strong>\/stream<\/strong><\/p>\n<p>You can connect to this stream with a variety of applications.<\/p>\n<p>One example is to stream this to another Raspberry Pi, you could do it with omxplayer:<\/p>\n<p>Install omxplayer on some other Raspberry Pi:<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">sudo apt-get install omxplayer<\/div><\/div>\n<p>Make a script called <strong>stream-video.sh<\/strong><\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">#!\/bin\/bash<br \/>\nkillall omxplayer.bin<br \/>\nsleep 1<br \/>\nomxplayer --aspect-mode stretch -o hdmi rtsp:\/\/10.69.0.23:8554\/stream<\/div><\/div>\n<p>Edit the IP address to be the camera&#8217;s IP.<\/p>\n<p>Make the script executable:<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">chmod +x stream-video.sh<\/div><\/div>\n<p>Run the script<\/p>\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:565px;\"><div class=\"text codecolorer\">.\/stream-video.sh<\/div><\/div>\n<p>and you should see the full screen video sent out the hdmi port<\/p>\n<h2>Works with Raspberry Pi Zero W<\/h2>\n<p>This technique of creating a RTSP server also works for getting high resolution and high frame rate out of the new Raspberry Pi Zero W camera packs (<a href=\"https:\/\/www.adafruit.com\/product\/3415\" target=\"_blank\" rel=\"noopener noreferrer\">infrared<\/a> or <a href=\"https:\/\/www.adafruit.com\/product\/3414\" target=\"_blank\" rel=\"noopener noreferrer\">standard<\/a>)! At $45 the bundle pack that comes with the case and infrared camera is a great way to add extra wireless cameras to your home security system.<\/p>\n<p><a href=\"https:\/\/chriscarey.com\/wp\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-w-noir.jpg\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1737\" data-permalink=\"https:\/\/chriscarey.com\/blog\/2017\/04\/30\/achieving-high-frame-rate-with-a-raspberry-pi-camera-system\/raspberry-pi-zero-w-noir\/\" data-orig-file=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-w-noir.jpg\" data-orig-size=\"970,728\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"raspberry pi zero w noir\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-w-noir-300x225.jpg\" data-large-file=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-w-noir.jpg\" class=\"alignnone size-medium wp-image-1737\" src=\"https:\/\/chriscarey.com\/wp\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-w-noir-300x225.jpg\" alt=\"\" width=\"300\" height=\"225\" srcset=\"https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-w-noir-300x225.jpg 300w, https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-w-noir-768x576.jpg 768w, https:\/\/chriscarey.com\/blog\/wp-content\/uploads\/2017\/04\/raspberry-pi-zero-w-noir.jpg 970w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>When you read about using Raspberry Pi cameras as part of your home security system, most of the information you will find will point you in the direction of running motion which is the de-facto standard for doing video motion detection on Linux. There are also variants of motion such as MotionEye or motionEyeOS which [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[59],"tags":[],"class_list":["post-1723","post","type-post","status-publish","format-standard","hentry","category-raspberry-pi"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/prpYG-rN","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/chriscarey.com\/blog\/wp-json\/wp\/v2\/posts\/1723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/chriscarey.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/chriscarey.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/chriscarey.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/chriscarey.com\/blog\/wp-json\/wp\/v2\/comments?post=1723"}],"version-history":[{"count":78,"href":"https:\/\/chriscarey.com\/blog\/wp-json\/wp\/v2\/posts\/1723\/revisions"}],"predecessor-version":[{"id":2129,"href":"https:\/\/chriscarey.com\/blog\/wp-json\/wp\/v2\/posts\/1723\/revisions\/2129"}],"wp:attachment":[{"href":"https:\/\/chriscarey.com\/blog\/wp-json\/wp\/v2\/media?parent=1723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/chriscarey.com\/blog\/wp-json\/wp\/v2\/categories?post=1723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chriscarey.com\/blog\/wp-json\/wp\/v2\/tags?post=1723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}