<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>take photo &#8211; 编码无悔 /  Intent &amp; Focused</title>
	<atom:link href="https://www.codelast.com/tag/take-photo/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.codelast.com</link>
	<description>最优化之路</description>
	<lastBuildDate>Tue, 28 Apr 2020 02:26:45 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>[原创]在Raspberry Pi(树莓派)上调用V4L2来操纵摄像头拍照/Use V4L2 on Raspberry Pi to Controll a Webcam to Grab Images</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%9c%a8raspberry-pi%e6%a0%91%e8%8e%93%e6%b4%be%e4%b8%8a%e8%b0%83%e7%94%a8v4l2%e6%9d%a5%e6%93%8d%e7%ba%b5%e6%91%84%e5%83%8f%e5%a4%b4%e6%8b%8d%e7%85%a7use-v4l2-on-raspberry-pi-t/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%9c%a8raspberry-pi%e6%a0%91%e8%8e%93%e6%b4%be%e4%b8%8a%e8%b0%83%e7%94%a8v4l2%e6%9d%a5%e6%93%8d%e7%ba%b5%e6%91%84%e5%83%8f%e5%a4%b4%e6%8b%8d%e7%85%a7use-v4l2-on-raspberry-pi-t/#comments</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Fri, 14 Mar 2014 17:33:23 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Raspberry Pi/树莓派]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[grab image]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[take photo]]></category>
		<category><![CDATA[V4L2]]></category>
		<category><![CDATA[Video4Linux]]></category>
		<category><![CDATA[webcam]]></category>
		<category><![CDATA[树莓派]]></category>
		<guid isPermaLink="false">http://www.codelast.com/?p=7873</guid>

					<description><![CDATA[<p>
<a href="http://www.raspberrypi.org/" target="_blank" rel="noopener noreferrer">Raspberry Pi</a>是什么？<br />
引用维基百科的一句话：</p>
<blockquote>
<p>
		The Raspberry Pi is a credit card sized single-board computer developed in the UK by the Raspberry Pi Foundation with the intention of stimulating the teaching of basic computer science in schools.</p>
</blockquote>
<p>简单地说，它就是一个基于ARM CPU的、信用卡那么大的迷你计算机。</p>
<p>我曾经写过<a href="http://www.codelast.com/?p=5014" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">一篇教程</span></a>，展示了如何调用OpenCV，来控制摄像头拍照。在那篇文章的末尾，我提到了一个遗留问题，即把抓取图像的尺寸设置得稍高一点的时候，那个程序就很容易崩溃；在图像尺寸设置得很低的时候，有时候也会崩溃，我一直没弄明白为什么。<br />
但是在前段时间，由于参赛原因，被迫在很短的时间内解决这个棘手的问题。真可谓是搜了无数网页，最后采取了一种折衷的方式&#8220;在很大程度上&#8221;解决了这个问题&#8212;&#8212;毕竟还不完美。<br />
<span id="more-7873"></span><br />
所以在这篇文章里，我打算介绍另一种方式来实现控制摄像头拍照，并且程序稳定得多（尽管程序还是会崩溃，但比OpenCV的版本少多了）。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%9c%a8raspberry-pi%e6%a0%91%e8%8e%93%e6%b4%be%e4%b8%8a%e8%b0%83%e7%94%a8v4l2%e6%9d%a5%e6%93%8d%e7%ba%b5%e6%91%84%e5%83%8f%e5%a4%b4%e6%8b%8d%e7%85%a7use-v4l2-on-raspberry-pi-t/" class="read-more">Read More </a></p>]]></description>
										<content:encoded><![CDATA[<p>
<a href="http://www.raspberrypi.org/" target="_blank" rel="noopener noreferrer">Raspberry Pi</a>是什么？<br />
引用维基百科的一句话：</p>
<blockquote>
<p>
		The Raspberry Pi is a credit card sized single-board computer developed in the UK by the Raspberry Pi Foundation with the intention of stimulating the teaching of basic computer science in schools.</p>
</blockquote>
<p>简单地说，它就是一个基于ARM CPU的、信用卡那么大的迷你计算机。</p>
<p>我曾经写过<a href="http://www.codelast.com/?p=5014" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">一篇教程</span></a>，展示了如何调用OpenCV，来控制摄像头拍照。在那篇文章的末尾，我提到了一个遗留问题，即把抓取图像的尺寸设置得稍高一点的时候，那个程序就很容易崩溃；在图像尺寸设置得很低的时候，有时候也会崩溃，我一直没弄明白为什么。<br />
但是在前段时间，由于参赛原因，被迫在很短的时间内解决这个棘手的问题。真可谓是搜了无数网页，最后采取了一种折衷的方式&ldquo;在很大程度上&rdquo;解决了这个问题&mdash;&mdash;毕竟还不完美。<br />
<span id="more-7873"></span><br />
所以在这篇文章里，我打算介绍另一种方式来实现控制摄像头拍照，并且程序稳定得多（尽管程序还是会崩溃，但比OpenCV的版本少多了）。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color:#00ff00;">『1』</span>把OpenCV换掉，选择知多少<br />
当时我第一个想法就是把OpenCV换掉，但是我还有什么选择呢？我先找到了<a href="https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/robot/image_processing/" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">这个网页</span></a>，它介绍了一种使用Python抓取摄像头图像的方法。但有个问题：如果你没有安装他们移植的系统（我应该没理解错吧...），那么就只能先按照要求安装他们提供的一些自定义library。很不巧，我使用的是Arch Linux ARM，所以当然要安装。不过，当我打开安装说明页之后，照做了几步之后，我就放弃了，因为太麻烦，路径都还要自己根据情况修改的，等我完全搞好之后，估计一个小时都过去了，而且还不一定能成。<br />
于是我又找到了若干篇用V4L来实现图像抓取的文章（<a href="http://linuxtv.org/downloads/v4l-dvb-apis/v4l2grab-example.html" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">链接1</span></a>，<a href="http://www.lavrsen.dk/svn/motion/tags/3.2.11/video2.c" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">链接2</span></a>），于是我抄来代码，在几乎看不懂的情况下，硬着头皮尝试去小修小改。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color:#00ff00;">『2』</span>V4L2是什么<br />
从前面提供的链接里，大家可以看到&ldquo;V4L2 video picture grabber&rdquo;的说明。V4L2是什么？从&nbsp;<a href="http://en.wikipedia.org/wiki/Video4Linux" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">这个Wiki页面</span></a>&nbsp;的部分内容：</p>
<blockquote>
<div>
		Video4Linux or V4L is a video capture[1] and output device API and driver framework for the Linux kernel, supporting many USB webcams, TV tuners, and other devices. Video4Linux is closely integrated with the Linux kernel.</div>
<div>
		V4L2 is the second version of V4L. Video4Linux2 fixed some design bugs and started appearing in the 2.5.X kernels.</div>
</blockquote>
<div>
	我们知道了V4L2是Linux内核的视频抓取和输出设备API和驱动框架，它支持非常多的USB摄像头等设备。所以，用它可以驱动摄像头抓取图像。<br />
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
	<span style="background-color:#00ff00;">『3』</span>输出什么格式的图片<br />
	显然，我们想要摄像头抓取并输出jpg，png之类的图片，但是，前面链接1里的代码输出的是PPM格式的图片。于是我看到了这行代码：</p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB24;
</pre>
</div>
<p>这里显然是控制文件格式的。根据前面的链接2，我把它改成了jpg格式：</p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
// ...
if (fmt.fmt.pix.pixelformat != V4L2_PIX_FMT_JPEG) {
  printf(&quot;Libv4l didn&#39;t accept jpg format. Can&#39;t proceed.\n&quot;);
  exit(EXIT_FAILURE);
}
</pre>
<p>可惜的是编译运行之后发现这里过不去，也就是不支持jpg格式。于是只能输出PPM格式的图片。PPM是&ldquo;可移植像素图格式&rdquo;的简称，它是没有压缩的，文件体积较大（一个640＊480的PPM图片竟然有900多K），所以它既不利于存储也不利于网络传输。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color:#00ff00;">『4』</span>PPM图片转换为jpg格式<br />
前面我说过，最终得到摄像头抓取图片的方式是一种折衷的方式，这里就是一个体现：先拿到PPM，再转为jpg，实在是不得已而为之，因为通过调用V4L2抓取图像比较稳定，而我又无法让抓取图像的程序直接输出jpg格式的图片，因此就再转一下。<br />
找来找去发现了用<a href="http://www.imagemagick.org/" target="_blank" rel="noopener noreferrer"><span style="background-color:#ffa07a;">ImageMagick</span></a>转格式很容易。于是先安装：</p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
pacman -S imagemagick
</pre>
<p>安装好之后，它就带了一个名为&ldquo;convert&rdquo;的程序，转换命令不要太简单：</p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
convert 1.ppm 1.jpg
</pre>
<p>这样就把1.ppm转换成了1.jpg。对320＊240大小的图片，我感觉转换速度是非常快的。<br />
<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
<span style="background-color:#00ff00;">『5』</span>完整代码<br />
程序文件名为 <span style="color:#0000ff;">webcam-stable.c</span>&nbsp;：</p>
<pre class="brush:cpp;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;errno.h&gt;
#include &lt;sys/ioctl.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/time.h&gt;
#include &lt;sys/mman.h&gt;
#include &lt;linux/videodev2.h&gt;
#include &lt;libv4l2.h&gt;
#include &lt;libv4l1.h&gt;

/**
 * A program to capture image via the camera. 
 *
 * @author Darran Zhang @ codelast.com
 */

#define CLEAR(x) memset(&amp;(x), 0, sizeof(x))

struct buffer {
  void   *start;
  size_t length;
};

static void xioctl(int fh, int request, void *arg)
{
  int r;

  do {
    r = v4l2_ioctl(fh, request, arg);
  } while (r == -1 &amp;&amp; ((errno == EINTR) || (errno == EAGAIN)));

  if (r == -1) {
    fprintf(stderr, &quot;error %d, %s\n&quot;, errno, strerror(errno));
    exit(EXIT_FAILURE);
  }
}

int main(int argc, char **argv) {
  if (argc &lt; 4) {
    printf(&quot;Usage: ./webcam [outputImagePath] [outputImageWidth] [outputImageHeight]\nE.g. ./webcam webcam.jpg 320 240\n&quot;);
    return 1;
  }

  char* outputImagePath = argv[1];
  int imageWidth = atoi(argv[2]);
  int imageHeight = atoi(argv[3]);

  struct v4l2_format              fmt;
  struct v4l2_buffer              buf;
  struct v4l2_requestbuffers      req;
  enum v4l2_buf_type              type;
  fd_set                          fds;
  struct timeval                  tv;
  int                             r, fd = -1;
  unsigned int                    i, n_buffers;
  char                            *dev_name = &quot;/dev/video0&quot;;
  char                            out_name[256];
  FILE                            *fout;
  struct buffer                   *buffers;

  fd = v4l2_open(dev_name, O_RDWR | O_NONBLOCK, 0);
  if (fd &lt; 0) {
    perror(&quot;Cannot open device&quot;);
    exit(EXIT_FAILURE);
  }

  CLEAR(fmt);
  fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  fmt.fmt.pix.width       = imageWidth;
  fmt.fmt.pix.height      = imageHeight;
  fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB24;
  //fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
  fmt.fmt.pix.field       = V4L2_FIELD_INTERLACED;
  xioctl(fd, VIDIOC_S_FMT, &amp;fmt);
  if (fmt.fmt.pix.pixelformat != V4L2_PIX_FMT_RGB24) {
    printf(&quot;Libv4l didn&#39;t accept RGB24 format. Can&#39;t proceed.\n&quot;);
    exit(EXIT_FAILURE);
  }
  if ((fmt.fmt.pix.width != imageWidth) || (fmt.fmt.pix.height != imageHeight))
    printf(&quot;Warning: driver is sending image at %dx%d\n&quot;, fmt.fmt.pix.width, fmt.fmt.pix.height);

  CLEAR(req);
  req.count = 2;
  req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  req.memory = V4L2_MEMORY_MMAP;
  xioctl(fd, VIDIOC_REQBUFS, &amp;req);

  buffers = calloc(req.count, sizeof(*buffers));
  for (n_buffers = 0; n_buffers &lt; req.count; ++n_buffers) {
    CLEAR(buf);

    buf.type        = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    buf.memory      = V4L2_MEMORY_MMAP;
    buf.index       = n_buffers;

    xioctl(fd, VIDIOC_QUERYBUF, &amp;buf);

    buffers[n_buffers].length = buf.length;
    buffers[n_buffers].start = v4l2_mmap(NULL, buf.length,
      PROT_READ | PROT_WRITE, MAP_SHARED,
      fd, buf.m.offset);

    if (MAP_FAILED == buffers[n_buffers].start) {
      perror(&quot;mmap&quot;);
      exit(EXIT_FAILURE);
    }
  }

  for (i = 0; i &lt; n_buffers; ++i) {
    CLEAR(buf);
    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    buf.memory = V4L2_MEMORY_MMAP;
    buf.index = i;
    xioctl(fd, VIDIOC_QBUF, &amp;buf);
  }
  type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  xioctl(fd, VIDIOC_STREAMON, &amp;type);

  do {
    FD_ZERO(&amp;fds);
    FD_SET(fd, &amp;fds);

    /* Timeout. */
    tv.tv_sec = 2;
    tv.tv_usec = 0;

    r = select(fd + 1, &amp;fds, NULL, NULL, &amp;tv);
  } while ((r == -1 &amp;&amp; (errno = EINTR)));
  if (r == -1) {
    perror(&quot;select&quot;);
    return errno;
  }

  CLEAR(buf);
  buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  buf.memory = V4L2_MEMORY_MMAP;
  xioctl(fd, VIDIOC_DQBUF, &amp;buf);

  fout = fopen(outputImagePath, &quot;w&quot;);
  if (!fout) {
    perror(&quot;Cannot open image&quot;);
    exit(EXIT_FAILURE);
  }
  fprintf(fout, &quot;P6\n%d %d 255\n&quot;,
    fmt.fmt.pix.width, fmt.fmt.pix.height);
  fwrite(buffers[buf.index].start, buf.bytesused, 1, fout);
  fclose(fout);

  xioctl(fd, VIDIOC_QBUF, &amp;buf);


  type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  xioctl(fd, VIDIOC_STREAMOFF, &amp;type);
  for (i = 0; i &lt; n_buffers; ++i) {
    v4l2_munmap(buffers[i].start, buffers[i].length);
  }
  v4l2_close(fd);

  return 0;
}
</pre>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="http://www.codelast.com/" target="_blank" rel="noopener noreferrer"><span style="color: rgb(255, 255, 255);">http://www.codelast.com/</span></a><br />
编译：</p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
gcc webcam-stable.c -lv4l2 -o webcam-stable
</pre>
<p>程序运行时需要3个参数，分别是输出图片文件的路径、输出图片的宽度、输出图片的高度，例如：</p>
<pre class="brush:plain;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
./webcam-stable /home/codelast/1.ppm 320 240
</pre>
<p>用一个脚本，在输出图片之后，再将其转为jpg格式，就完成了我们的任务。</p>
<p><span style="background-color:#00ff00;">『6』</span>总结<br />
<span style="background-color:#ee82ee;">[1]</span> 在解决上述问题的过程中，我遇到了无数的问题（例如编译时找不到某些库），因此为了解决那些问题，我安装了很多package，但我不确定它们是否全都需要，并且也没有来得及把它们全都记录下来，因此，我把记下来的写在这里，仅供参考：</p>
<pre class="brush:shell;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;">
pacman -S xf86-video-v4l
</pre>
<p>
<span style="background-color:#ee82ee;">[2]</span> 这个程序比OpenCV版的程序要稳定得多，体现在抓取成功（程序不提示错误）的机会大得多，但我得承认，它还是有问题的，有时候会出错：</p>
<blockquote>
<p>
		error 12, Cannot allocate memory</p>
</blockquote>
<p>然后就没能抓下来图片。看这提示是内存不够（我是512MB的Pi）？但具体原因我还是不知道为什么，如果你知道怎么优化，请不吝赐教。</p>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;版权声明&nbsp;<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;<br />
转载需注明出处：<u><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><em><span style="color: rgb(0, 0, 255);"><strong style="font-size: 16px;"><span style="font-family: arial, helvetica, sans-serif;">codelast.com</span></strong></span></em></a></u>&nbsp;<br />
感谢关注我的微信公众号（微信扫一扫）：</p>
<p style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
	<img decoding="async" alt="wechat qrcode of codelast" src="https://www.codelast.com/codelast_wechat_qr_code.jpg" style="width: 200px; height: 200px;" /></p>

			<!--[syntaxhighlighter]-->
			<!--代码高亮，请勿编辑-->
			<script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shCore.js"></script><script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shBrushCpp.js"></script>
<script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shBrushShell.js"></script>
<script type="text/javascript" src="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/scripts/shBrushPlain.js"></script>

			<link type="text/css" rel="stylesheet" href="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/styles/shCoreCk.css" />
			<link type="text/css" rel="stylesheet" href="https://www.codelast.com/wp-content/plugins/ck-and-syntaxhighlighter/syntaxhighlighter/styles/shThemeCk.css" />
			<script type="text/javascript">
			SyntaxHighlighter.defaults['class-name']	= '';
			SyntaxHighlighter.defaults['smart-tabs']	= true;
			SyntaxHighlighter.defaults['tab-size']		= 2;
			SyntaxHighlighter.defaults['gutter']		= true;
			SyntaxHighlighter.defaults['quick-code']	= true;
			SyntaxHighlighter.defaults['collapse'] 		= false;
			SyntaxHighlighter.defaults['auto-links']	= true;
			SyntaxHighlighter.defaults['toolbar']		= true;
			SyntaxHighlighter.all();
			</script>
			<!--[/syntaxhighlighter]-->]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b%e5%9c%a8raspberry-pi%e6%a0%91%e8%8e%93%e6%b4%be%e4%b8%8a%e8%b0%83%e7%94%a8v4l2%e6%9d%a5%e6%93%8d%e7%ba%b5%e6%91%84%e5%83%8f%e5%a4%b4%e6%8b%8d%e7%85%a7use-v4l2-on-raspberry-pi-t/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
