]> pere.pagekite.me Git - homepage.git/blobdiff - blog/archive/2018/07/07.rss
Publish nikita beta article.
[homepage.git] / blog / archive / 2018 / 07 / 07.rss
index bc975bfcab59a4e47af16812dfe9c11e976f60f2..a6a918ce7418e148593d4a59ff40e1df2c9d4a2f 100644 (file)
                 <link>http://people.skolelinux.org/pere/blog/</link>
 
        
+       <item>
+               <title>Sharing images with friends and family using RSS and EXIF/XMP metadata</title>
+               <link>http://people.skolelinux.org/pere/blog/Sharing_images_with_friends_and_family_using_RSS_and_EXIF_XMP_metadata.html</link>        
+               <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Sharing_images_with_friends_and_family_using_RSS_and_EXIF_XMP_metadata.html</guid>
+                <pubDate>Tue, 31 Jul 2018 23:30:00 +0200</pubDate>
+               <description>&lt;p&gt;For a while now, I have looked for a sensible way to share images
+with my family using a self hosted solution, as it is unacceptable to
+place images from my personal life under the control of strangers
+working for data hoarders like Google or Dropbox.  The last few days I
+have drafted an approach that might work out, and I would like to
+share it with you.  I would like to publish images on a server under
+my control, and point some Internet connected display units using some
+free and open standard to the images I published.  As my primary
+language is not limited to ASCII, I need to store metadata using
+UTF-8.  Many years ago, I hoped to find a digital photo frame capable
+of reading a RSS feed with image references (aka using the
+&amp;lt;enclosure&amp;gt; RSS tag), but was unable to find a current supplier
+of such frames.  In the end I gave up that approach.&lt;/p&gt;
+
+&lt;p&gt;Some months ago, I discovered that
+&lt;a href=&quot;https://www.jwz.org/xscreensaver/&quot;&gt;XScreensaver&lt;/a&gt; is able to
+read images from a RSS feed, and used it to set up a screen saver on
+my home info screen, showing images from the Daily images feed from
+NASA.  This proved to work well.  More recently I discovered that
+&lt;a href=&quot;https://kodi.tv&quot;&gt;Kodi&lt;/a&gt; (both using
+&lt;a href=&quot;https://www.openelec.tv/&quot;&gt;OpenELEC&lt;/a&gt; and
+&lt;a href=&quot;https://libreelec.tv&quot;&gt;LibreELEC&lt;/a&gt;) provide the
+&lt;a href=&quot;https://github.com/grinsted/script.screensaver.feedreader&quot;&gt;Feedreader&lt;/a&gt;
+screen saver capable of reading a RSS feed with images and news.  For
+fun, I used it this summer to test Kodi on my parents TV by hooking up
+a Raspberry PI unit with LibreELEC, and wanted to provide them with a
+screen saver showing selected pictures from my selection.&lt;/p&gt;
+
+&lt;p&gt;Armed with motivation and a test photo frame, I set out to generate
+a RSS feed for the Kodi instance.  I adjusted my &lt;a
+href=&quot;https://freedombox.org/&quot;&gt;Freedombox&lt;/a&gt; instance, created
+/var/www/html/privatepictures/, wrote a small Perl script to extract
+title and description metadata from the photo files and generate the
+RSS file.  I ended up using Perl instead of python, as the
+libimage-exiftool-perl Debian package seemed to handle the EXIF/XMP
+tags I ended up using, while python3-exif did not.  The relevant EXIF
+tags only support ASCII, so I had to find better alternatives.  XMP
+seem to have the support I need.&lt;/p&gt;
+
+&lt;p&gt;I am a bit unsure which EXIF/XMP tags to use, as I would like to
+use tags that can be easily added/updated using normal free software
+photo managing software.  I ended up using the tags set using this
+exiftool command, as these tags can also be set using digiKam:&lt;/p&gt;
+
+&lt;blockquote&gt;&lt;pre&gt;
+exiftool -headline=&#39;The RSS image title&#39; \
+  -description=&#39;The RSS image description.&#39; \
+  -subject+=for-family photo.jpeg
+&lt;/pre&gt;&lt;/blockquote&gt;
+
+&lt;p&gt;I initially tried the &quot;-title&quot; and &quot;keyword&quot; tags, but they were
+invisible in digiKam, so I changed to &quot;-headline&quot; and &quot;-subject&quot;.  I
+use the keyword/subject &#39;for-family&#39; to flag that the photo should be
+shared with my family.  Images with this keyword set are located and
+copied into my Freedombox for the RSS generating script to find.&lt;/p&gt;
+
+&lt;p&gt;Are there better ways to do this?  Get in touch if you have better
+suggestions.&lt;/p&gt;
+
+&lt;p&gt;As usual, if you use Bitcoin and want to show your support of my
+activities, please send Bitcoin donations to my address
+&lt;b&gt;&lt;a href=&quot;bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&quot;&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;
+</description>
+       </item>
+       
+       <item>
+               <title>Simple streaming the Linux desktop to Kodi using GStreamer and RTP</title>
+               <link>http://people.skolelinux.org/pere/blog/Simple_streaming_the_Linux_desktop_to_Kodi_using_GStreamer_and_RTP.html</link>        
+               <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Simple_streaming_the_Linux_desktop_to_Kodi_using_GStreamer_and_RTP.html</guid>
+                <pubDate>Thu, 12 Jul 2018 17:55:00 +0200</pubDate>
+               <description>&lt;p&gt;Last night, I wrote
+&lt;a href=&quot;http://people.skolelinux.org/pere/blog/Streaming_the_Linux_desktop_to_Kodi_using_VLC_and_RTSP.html&quot;&gt;a
+recipe to stream a Linux desktop using VLC to a instance of Kodi&lt;/a&gt;.
+During the day I received valuable feedback, and thanks to the
+suggestions I have been able to rewrite the recipe into a much simpler
+approach requiring no setup at all.  It is a single script that take
+care of it all.&lt;/p&gt;
+
+&lt;p&gt;This new script uses GStreamer instead of VLC to capture the
+desktop and stream it to Kodi.  This fixed the video quality issue I
+saw initially.  It further removes the need to add a m3u file on the
+Kodi machine, as it instead connects to
+&lt;a href=&quot;https://kodi.wiki/view/JSON-RPC_API/v8&quot;&gt;the JSON-RPC API in
+Kodi&lt;/a&gt; and simply ask Kodi to play from the stream created using
+GStreamer.  Streaming the desktop to Kodi now become trivial.  Copy
+the script below, run it with the DNS name or IP address of the kodi
+server to stream to as the only argument, and watch your screen show
+up on the Kodi screen.  Note, it depend on multicast on the local
+network, so if you need to stream outside the local network, the
+script must be modified.  Also note, I have no idea if audio work, as
+I only care about the picture part.&lt;/p&gt;
+
+&lt;blockquote&gt;&lt;pre&gt;
+#!/bin/sh
+#
+# Stream the Linux desktop view to Kodi.  See
+# http://people.skolelinux.org/pere/blog/Streaming_the_Linux_desktop_to_Kodi_using_VLC_and_RTSP.html
+# for backgorund information.
+
+# Make sure the stream is stopped in Kodi and the gstreamer process is
+# killed if something go wrong (for example if curl is unable to find the
+# kodi server).  Do the same when interrupting this script.
+kodicmd() {
+    host=&quot;$1&quot;
+    cmd=&quot;$2&quot;
+    params=&quot;$3&quot;
+    curl --silent --header &#39;Content-Type: application/json&#39; \
+        --data-binary &quot;{ \&quot;id\&quot;: 1, \&quot;jsonrpc\&quot;: \&quot;2.0\&quot;, \&quot;method\&quot;: \&quot;$cmd\&quot;, \&quot;params\&quot;: $params }&quot; \
+        &quot;http://$host/jsonrpc&quot;
+}
+cleanup() {
+    if [ -n &quot;$kodihost&quot; ] ; then
+       # Stop the playing when we end
+       playerid=$(kodicmd &quot;$kodihost&quot; Player.GetActivePlayers &quot;{}&quot; |
+                           jq .result[].playerid)
+       kodicmd &quot;$kodihost&quot; Player.Stop &quot;{ \&quot;playerid\&quot; : $playerid }&quot; &gt; /dev/null
+    fi
+    if [ &quot;$gstpid&quot; ] &amp;&amp; kill -0 &quot;$gstpid&quot; &gt;/dev/null 2&gt;&amp;1; then
+       kill &quot;$gstpid&quot;
+    fi
+}
+trap cleanup EXIT INT
+
+if [ -n &quot;$1&quot; ]; then
+    kodihost=$1
+    shift
+else
+    kodihost=kodi.local
+fi
+
+mcast=239.255.0.1
+mcastport=1234
+mcastttl=1
+
+pasrc=$(pactl list | grep -A2 &#39;Source #&#39; | grep &#39;Name: .*\.monitor$&#39; | \
+  cut -d&quot; &quot; -f2|head -1)
+gst-launch-1.0 ximagesrc use-damage=0 ! video/x-raw,framerate=30/1 ! \
+  videoconvert ! queue2 ! \
+  x264enc bitrate=8000 speed-preset=superfast tune=zerolatency qp-min=30 \
+  key-int-max=15 bframes=2 ! video/x-h264,profile=high ! queue2 ! \
+  mpegtsmux alignment=7 name=mux ! rndbuffersize max=1316 min=1316 ! \
+  udpsink host=$mcast port=$mcastport ttl-mc=$mcastttl auto-multicast=1 sync=0 \
+  pulsesrc device=$pasrc ! audioconvert ! queue2 ! avenc_aac ! queue2 ! mux. \
+  &gt; /dev/null 2&gt;&amp;1 &amp;
+gstpid=$!
+
+# Give stream a second to get going
+sleep 1
+
+# Ask kodi to start streaming using its JSON-RPC API
+kodicmd &quot;$kodihost&quot; Player.Open \
+       &quot;{\&quot;item\&quot;: { \&quot;file\&quot;: \&quot;udp://@$mcast:$mcastport\&quot; } }&quot; &gt; /dev/null
+
+# wait for gst to end
+wait &quot;$gstpid&quot;
+&lt;/pre&gt;&lt;/blockquote&gt;
+
+&lt;p&gt;I hope you find the approach useful.  I know I do.&lt;/p&gt;
+
+&lt;p&gt;As usual, if you use Bitcoin and want to show your support of my
+activities, please send Bitcoin donations to my address
+&lt;b&gt;&lt;a href=&quot;bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&quot;&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;
+</description>
+       </item>
+       
        <item>
                <title>Streaming the Linux desktop to Kodi using VLC and RTSP</title>
                <link>http://people.skolelinux.org/pere/blog/Streaming_the_Linux_desktop_to_Kodi_using_VLC_and_RTSP.html</link>        
                <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Streaming_the_Linux_desktop_to_Kodi_using_VLC_and_RTSP.html</guid>
                 <pubDate>Thu, 12 Jul 2018 02:00:00 +0200</pubDate>
-               <description>&lt;p&gt;A while back, I was asked by a friend how to stream the desktop to
+               <description>&lt;p&gt;PS: See
+&lt;ahref=&quot;http://people.skolelinux.org/pere/blog/Simple_streaming_the_Linux_desktop_to_Kodi_using_GStreamer_and_RTP.html&quot;&gt;the
+followup post&lt;/a&gt; for a even better approach.&lt;/p&gt;
+
+&lt;p&gt;A while back, I was asked by a friend how to stream the desktop to
 my projector connected to Kodi.  I sadly had to admit that I had no
 idea, as it was a task I never had tried.  Since then, I have been
 looking for a way to do so, preferable without much extra software to
@@ -60,8 +234,8 @@ echo rtsp://192.168.11.4:8080/test.sdp \
 &lt;p&gt;Note the 192.168.11.4 IP address is my desktops IP address.  As far
 as I can tell the IP must be hardcoded for this to work.  In other
 words, if someone elses machine is going to do the steaming, you have
-to update screenstream.m4u on the Kodi machine and adjust the vlc
-repice.  To get started, locate the file in Kodi and select the m3u
+to update screenstream.m3u on the Kodi machine and adjust the vlc
+recipe.  To get started, locate the file in Kodi and select the m3u
 file while the VLC stream is running.  The desktop then show up in my
 big screen. :)&lt;/p&gt;
 
@@ -70,6 +244,79 @@ the audio quality is really bad.  No idea if the problem is package
 loss or bad parameters for the transcode.  I do not know VLC nor Kodi
 enough to tell.&lt;/p&gt;
 
+&lt;p&gt;&lt;strong&gt;Update 2018-07-12&lt;/strong&gt;: Johannes Schauer send me a few
+succestions and reminded me about an important step.  The &quot;screen:&quot;
+input source is only available once the vlc-plugin-access-extra
+package is installed on Debian.  Without it, you will see this error
+message: &quot;VLC is unable to open the MRL &#39;screen://&#39;.  Check the log
+for details.&quot;  He further found that it is possible to drop some parts
+of the VLC command line to reduce the amount of hardcoded information.
+It is also useful to consider using cvlc to avoid having the VLC
+window in the desktop view.  In sum, this give us this command line on
+the source end
+
+&lt;blockquote&gt;&lt;pre&gt;
+cvlc screen:// --sout \
+  &#39;#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128}:rtp{sdp=rtsp://:8080/}&#39;
+&lt;/pre&gt;&lt;/blockquote&gt;
+
+&lt;p&gt;and this on the Kodi end&lt;p&gt;
+
+&lt;blockquote&gt;&lt;pre&gt;
+echo rtsp://192.168.11.4:8080/ \
+  &gt; /storage/videos/screenstream.m3u
+&lt;/pre&gt;&lt;/blockquote&gt;
+
+&lt;p&gt;Still bad image quality, though.  But I did discover that streaming
+a DVD using dvdsimple:///dev/dvd as the source had excellent video and
+audio quality, so I guess the issue is in the input or transcoding
+parts, not the rtsp part.  I&#39;ve tried to change the vb and ab
+parameters to use more bandwidth, but it did not make a
+difference.&lt;/p&gt;
+
+&lt;p&gt;I further received a suggestion from Einar Haraldseid to try using
+gstreamer instead of VLC, and this proved to work great!  He also
+provided me with the trick to get Kodi to use a multicast stream as
+its source.  By using this monstrous oneliner, I can stream my desktop
+with good video quality in reasonable framerate to the 239.255.0.1
+multicast address on port 1234:
+
+&lt;blockquote&gt;&lt;pre&gt;
+gst-launch-1.0 ximagesrc use-damage=0 ! video/x-raw,framerate=30/1 ! \
+  videoconvert ! queue2 ! \
+  x264enc bitrate=8000 speed-preset=superfast tune=zerolatency qp-min=30 \
+  key-int-max=15 bframes=2 ! video/x-h264,profile=high ! queue2 ! \
+  mpegtsmux alignment=7 name=mux ! rndbuffersize max=1316 min=1316 ! \
+  udpsink host=239.255.0.1 port=1234 ttl-mc=1 auto-multicast=1 sync=0 \
+  pulsesrc device=$(pactl list | grep -A2 &#39;Source #&#39; | \
+    grep &#39;Name: .*\.monitor$&#39; |  cut -d&quot; &quot; -f2|head -1) ! \
+  audioconvert ! queue2 ! avenc_aac ! queue2 ! mux.
+&lt;/pre&gt;&lt;/blockquote&gt;
+
+&lt;p&gt;and this on the Kodi end&lt;p&gt;
+
+&lt;blockquote&gt;&lt;pre&gt;
+echo udp://@239.255.0.1:1234 \
+  &gt; /storage/videos/screenstream.m3u
+&lt;/pre&gt;&lt;/blockquote&gt;
+
+&lt;p&gt;Note the trick to pick a valid pulseaudio source.  It might not
+pick the one you need.  This approach will of course lead to trouble
+if more than one source uses the same multicast port and address.
+Note the ttl-mc=1 setting, which limit the multicast packages to the
+local network.  If the value is increased, your screen will be
+broadcasted further, one network &quot;hop&quot; for each increase (read up on
+multicast to learn more. :)!&lt;/p&gt;
+
+&lt;p&gt;Having cracked how to get Kodi to receive multicast streams, I
+could use this VLC command to stream to the same multicast address.
+The image quality is way better than the rtsp approach, but gstreamer
+seem to be doing a better job.&lt;/p&gt;
+
+&lt;blockquote&gt;&lt;pre&gt;
+cvlc screen:// --sout &#39;#transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128}:rtp{mux=ts,dst=239.255.0.1,port=1234,sdp=sap}&#39;
+&lt;/pre&gt;&lt;/blockquote&gt;
+
 &lt;p&gt;As usual, if you use Bitcoin and want to show your support of my
 activities, please send Bitcoin donations to my address
 &lt;b&gt;&lt;a href=&quot;bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&quot;&gt;15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&lt;/a&gt;&lt;/b&gt;.&lt;/p&gt;