﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-elva</title><link>http://www.cppblog.com/elva/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 06 Apr 2026 05:51:49 GMT</lastBuildDate><pubDate>Mon, 06 Apr 2026 05:51:49 GMT</pubDate><ttl>60</ttl><item><title>5imx2s</title><link>http://www.cppblog.com/elva/archive/2013/11/29/204513.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Fri, 29 Nov 2013 05:34:00 GMT</pubDate><guid>http://www.cppblog.com/elva/archive/2013/11/29/204513.html</guid><wfw:comment>http://www.cppblog.com/elva/comments/204513.html</wfw:comment><comments>http://www.cppblog.com/elva/archive/2013/11/29/204513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/elva/comments/commentRss/204513.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/elva/services/trackbacks/204513.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 让收东西更容易，这是一种进步。<br /><br /><br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/elva/5imx2s/1.png" height="557" width="522" /><br /><br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/elva/5imx2s/2.png" height="356" width="546" /><br /><br /><div><img alt="" src="http://www.cppblog.com/images/cppblog_com/elva/5imx2s/3.png" height="356" width="602" /><br /><br /><br /><br />下载：<div>http://www.easyice.cn/5imx2s/download.htm</div></div><img src ="http://www.cppblog.com/elva/aggbug/204513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/elva/" target="_blank">叶子</a> 2013-11-29 13:34 <a href="http://www.cppblog.com/elva/archive/2013/11/29/204513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TS OVER IP的多画面合成</title><link>http://www.cppblog.com/elva/archive/2013/05/31/200717.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Fri, 31 May 2013 06:52:00 GMT</pubDate><guid>http://www.cppblog.com/elva/archive/2013/05/31/200717.html</guid><wfw:comment>http://www.cppblog.com/elva/comments/200717.html</wfw:comment><comments>http://www.cppblog.com/elva/archive/2013/05/31/200717.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/elva/comments/commentRss/200717.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/elva/services/trackbacks/200717.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 许久没写博客了，似乎现在也很难静下心来去写东西，倒也不是心情浮躁，以前的写blog用来收集网上文章，记录自己的一些经验，后来假设了自己的文件服务器，用wiz做了笔记的server,收集什么东西用wiz就完成了，自己记录点经验也不在乎格式，也都没拿出来分享。这次辛辛苦苦做完一个项目，其中遇到一些问题，没有网络上的资料自己是很难解决的。因此整理点东西，与大家分享，也不能总受之与人吧。<br /><br /><div>&nbsp;&nbsp;&nbsp; 终于做完了多画面合成的项目，颇有心得，其间也遇到一些问题，没有网络上的资料自己是很难解决的，但也不是所有东西都能在网上找到办法，使用ffmpeg遇到太多问题，许多只能通过阅读源码解决。如今做完了，拿出来与众分享。<br />画面合成器是将多个承载于UDP的TS流（MPTS，SPTS）解码，将解码后图像缩放成小画面，再将各个源合并成2x2,3x3,4x4等方式，实现电视墙的效果。<br />项目的需求是这样的：<br />1.UDP输入UDP输出<br />2.提供源切换的接口，客户会再某个时刻换掉某个源<br />3.良好的异常处理，某个UDP源断流或恢复不影响现有节目。这不是客户的要求，但有过大型项目经验的人知道，这是一定要考虑的<br />从实现层面来讲，需要以下技术点：<br />1.UDP单播组播接收<br />2.TS封装的H264与MPEG2视频解码为YUV<br />3.YUV缩放<br />4.YUV画面拼接<br />5.合成后的YUV压缩为H264<br />6.压缩后的视频打包TS<br />7.打包后的TS通过UDP发送<br />8.发送时需要进行流控，保证VLC可正常播放。<br />这些技术点不算难，真正的难点在于统筹运作，N个源各自的解码后画面输出速度不同，虽然我们要求各源帧率相同。各解码线程画面输出虽整体相同，但肯定会忽高忽低。如果每个源都正常的话，我们可以等待每个源都有画面的时候才进行合成。但是我们需要考虑源断流与恢复，就不能一直等待某个源。其二，为了支持源切换，我们应该涉及好运作模式，实现无缝切换，但这些只是我特定 业务的需要，接下来只讲与ffmpeg相关技术。<br />先讲上面提到的8个技术点，UDP收发就不用说了，值得一提的是接收需要使用异步模式，这个在后面会提到。除了YUV画面拼接，其他都可以用ffmpeg sdk实现。因此主要讨论使用ffmpeg进行解码编码，这种技术文章其实很多，但他们一般只有简单的方案，对于这些比较常见的东西，我们也不做讨论，只讨论几个重点，而又缺乏资料的问题，主要有：<br />1.对解码及编码自定义io回掉。UDP接收及发送不通过ffmpeg实现。对于UDP源来说，ffmpeg对MPTS支持不好。对于输出UDP来说，ffmpeg没有流控<br /><br />有时我们希望ffmpeg的api打开的不是文件或某个协议的URL，直接传递数据缓冲给他，ffmpeg不支持传递数据指针给他，要求他编码或解码，这在ffmpeg api中的实现方式是IO回掉函数。他在需要的时候来调用你的函数来读取或写入。以解码为例，下面为示例代码：<br />AVIOContext *pb = avio_alloc_context(pbuf+1316, AVIO_BUF_SIZE-1316, 0, this, ReadDataCb, NULL, NULL);<br />if (av_probe_input_buffer(pb, &amp;pinFmt, "", NULL, 0, MAX_PROBE_SIZE) &lt; 0)<br />{<br />//error...<br />}<br />AVFormatContext *pFmtCt = avformat_alloc_context();<br />pFmtCt-&gt;pb = pb;<br />if (avformat_open_input(&amp;pFmtCt, "", pinFmt, NULL) &lt; 0)<br />{<br />//error...<br />}<br />读取回掉原型如下：<br />static int ReadDataCb(void *opaque, uint8_t *buf, int buf_size);<br />实现理念一般应该是除非想要停止解码，返回-1，否则返回数据长度。保证他读到数据<br /><br />不知道是出于内存对齐还是什么原因，<br />uint8_t *pbuf = (uint8_t *)calloc(AVIO_BUF_SIZE,1);<br />pb = avio_alloc_context(pbuf+1316, AVIO_BUF_SIZE-1316, 0, this, ReadDataCb, NULL, NULL);<br />的时候第一个参数直接传pbuf会崩溃，所以+1316<br />而若使用av_mallocz，虽可以直接传pbuf,却在av_free的时候崩溃，没有找到原因。<br /><br />2.由于需要实现切换，所以需要将某个源完全销毁，不产生内存泄露，不要小看这个问题，网上的很多代码是不对的。<br /><br />销毁 AVFormatContext<br />正确销毁方式：<br />/* close decoder for each stream */<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (int i = 0; i &lt; pFmtCt-&gt;nb_streams; i++)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (pFmtCt-&gt;streams[i]-&gt;codec-&gt;codec_id != AV_CODEC_ID_NONE)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;THREAD_MUTEX_LOCK(&amp;g_mutex_avcodec_oc);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;avcodec_close(pFmtCt-&gt;streams[i]-&gt;codec);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;THREAD_MUTEX_UNLOCK(&amp;g_mutex_avcodec_oc);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;avformat_close_input(&amp;pFmtCt);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />销毁 AVIOContext<br />//不可使用avio_close<br />&nbsp;&nbsp; &nbsp;av_free(pb-&gt;buffer);<br />&nbsp;&nbsp; &nbsp;av_free(pb);<br /><br />销毁 AVFrame<br />AVFrame *pframe = avcodec_alloc_frame();<br />avcodec_free_frame(&amp;pframe);&nbsp;&nbsp; &nbsp;<br /><br /><br />3.多线程使用ffmpeg sdk问题<br />avcodec_open/avcodec_close不是线程安全的，必须进行全局加锁保护，或者其他同步方式。除了这两个函数外，由于av_find_stream_info内部调用了avcodec_open，也需要加锁。但av_find_stream_info有可能执行时间比较长，如果没特别的必要，可以不使用此函数。对于解码来说，有下面两个函数：<br />av_probe_input_buffer<br />avformat_open_input<br />大部分情况下已经可以正常解码了。<br /><br />关于压缩<br />ffmpeg压缩H264 TS时CBR并不好用，设置了mux_rate会导致TS封装出错。老老实实用VBR，不设置mux_rate<br />进行H264压缩时一个选项一定要设置的：<br />preset<br />在压缩效率和运算时间中平衡的预设值，可用选项：<br />ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow and placebo</div><br /><img src ="http://www.cppblog.com/elva/aggbug/200717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/elva/" target="_blank">叶子</a> 2013-05-31 14:52 <a href="http://www.cppblog.com/elva/archive/2013/05/31/200717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TS 流复用器软件 下载</title><link>http://www.cppblog.com/elva/archive/2012/05/31/176929.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Thu, 31 May 2012 06:55:00 GMT</pubDate><guid>http://www.cppblog.com/elva/archive/2012/05/31/176929.html</guid><wfw:comment>http://www.cppblog.com/elva/comments/176929.html</wfw:comment><comments>http://www.cppblog.com/elva/archive/2012/05/31/176929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/elva/comments/commentRss/176929.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/elva/services/trackbacks/176929.html</trackback:ping><description><![CDATA[<div><a href="/Files/elva/dvbmux.rar">/Files/elva/dvbmux.rar<br /><br /></a>本程序是libdvbmux sdk的 示例程序，实现两个文件复用为一个文件。输入文件支持复用流。</div><div></div><div>使用帮助：</div><div>命令行程序，在cmd下执行,程序运行需要三个参数：输入文件1 输入文件2 输出文件</div><div></div><div>示例：</div><div>dvbmux d:\1.ts d:\2.ts d:\mux.ts</div><div></div><div></div><div>任何问题,请致信：</div><div>shangxinjian1972@163.com</div><div></div><div></div><div>2012-5-31</div><img src ="http://www.cppblog.com/elva/aggbug/176929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/elva/" target="_blank">叶子</a> 2012-05-31 14:55 <a href="http://www.cppblog.com/elva/archive/2012/05/31/176929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PAFF 和MBAFF  </title><link>http://www.cppblog.com/elva/archive/2012/04/18/171874.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Wed, 18 Apr 2012 07:59:00 GMT</pubDate><guid>http://www.cppblog.com/elva/archive/2012/04/18/171874.html</guid><wfw:comment>http://www.cppblog.com/elva/comments/171874.html</wfw:comment><comments>http://www.cppblog.com/elva/archive/2012/04/18/171874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/elva/comments/commentRss/171874.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/elva/services/trackbacks/171874.html</trackback:ping><description><![CDATA[<p>PAFF 和MBAFF：当对隔行扫描图像进行编码时，每帧包括两个场，由于两个场之间存在较大的扫描间隔，这样，对运动图像来说，帧中相邻两行之间的空间相关性相对于逐行扫描时就会减小，因此这时对两个场分别进行编码会更节省码流。对帧来说，存在三种可选的编码方式：将两场合并作为一帧进行编码(frame 方式)或将两场分别编码(field 方式)或将两场合并起来作为一帧，但不同的是将帧中垂直相邻的两个宏块合并为宏块对进行编码；前两种称为PAFF 编码，对运动区域进行编码时field 方式有效，对非运区域编码时，由于相邻两行有较大的相关性，因而frame 方式会更有效。当图像同时存在运动区域和非运动区域时，在MB 层次上，对运动区域采取field 方式，对非运动区域采取frame 方式会更加有效，这种方式就称为MBAFF，预测的单位是宏块对。 <br />&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在隔行扫描帧中，当有移动的对象或摄像机移动时，与逐行相比，两个相邻行倾向减少统计的相关性，这种情况应比每场分别压缩更为有效。为了达到高效率，H.264/AVC在编码帧时，有以下可选方案：</p>
<p>&nbsp;&nbsp;&nbsp; &#9679; 结合两场成一个完整帧，作为帧编码，称为帧模式。</p>
<p>&nbsp;&nbsp;&nbsp; &#9679; 两场分别编码，称为场模式。</p>
<p>&nbsp;&nbsp;&nbsp; &#9679; 结合两场成一个完整帧，作为帧压缩。在编码时，划分垂直相邻的两个宏块对成两个场宏块对或帧宏块，再进行编码。</p>
<p>&nbsp;&nbsp;&nbsp; 每帧图像可自适应选择3种模式之一进行编码。在前两种之间进行选择称为图像自适应帧/场编码（PAFF），当一帧作为两场编码时，每场划分为宏块，编码方式与帧编码方式很相似，主要有下面的例外：</p>
<p>&nbsp;&nbsp;&nbsp; &#9679; 运动补偿用参考场，而不是参考帧。</p>
<p>&nbsp;&nbsp;&nbsp; &#9679; 变换系数的&#8220;之字型&#8221;扫描方式不同。</p>
<p>&nbsp;&nbsp;&nbsp; &#9679; 宏块水平边沿去块滤波器的强度不选用&#8220;强&#8221;，因为场行在空间上是两倍帧行的距离。</p>
<p>&nbsp;&nbsp;&nbsp; 在研制H.264/AVC标准时，据报道，采用ITU-601分辨率，PAFF编码技术与帧编码相比可减少码率16%到20%。</p>
<p>&nbsp;&nbsp;&nbsp; 如果图像由运动区和非运动区混合组成，非运动区用帧模式、运动区用场模式是最有效的编码方法。因此每个垂直宏块对（16&#215;32）可独立选择编码（帧/场）模式。这种编码选择称为宏块自适应帧/场编码（MBAFF）。对于帧模式宏块对，每个宏块包含帧行，对于场模式宏块对，顶部宏块包含顶场行，底部宏块包含底场行。</p>
<p>&nbsp;&nbsp;&nbsp; 处理场宏块对的每个宏块与帧PAFF模式相似，然而，因为在MBAFF帧中发生场/帧宏块对混合，需要修改用作下列用途的方法：</p>
<p>&nbsp;&nbsp;&nbsp; &#9679; 之字型扫描。</p>
<p>&nbsp;&nbsp;&nbsp; &#9679; 运动矢量预测。</p>
<p>&nbsp;&nbsp;&nbsp; &#9679; 帧内预测模式的预测。</p>
<p>&nbsp;&nbsp;&nbsp; &#9679; 帧内预测帧采样精度。</p>
<p>&nbsp;&nbsp;&nbsp; &#9679; 去块效应滤波器。</p>
<p>&nbsp;&nbsp;&nbsp; &#9679; 上下文模型的熵编码。</p>
<p>&nbsp;&nbsp;&nbsp; 主要思想是尽可能保留多的空间一致性，MBAFF帧的空间相邻的规范相当复杂，下面讲到的空间相邻都是指非MBAFF帧。</p>
<p>&nbsp;&nbsp;&nbsp; MBAFF 和PAFF的另一个重要区别是：使用MBAFF方法，一个场不能使用同一帧的另一个场中的宏块作为运动补偿参考。这样，有时PAFF比MBAFF编码更有效，特别是在快速全局运动、变换场景、图像刷新等情况下。</p>
<p>&nbsp;&nbsp;&nbsp; 在开发MBAFF标准期间，据报道，采用ITU-601分辨率，MBAFF编码技术比PAFF相比可减少码率14%到16%。</p><img src ="http://www.cppblog.com/elva/aggbug/171874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/elva/" target="_blank">叶子</a> 2012-04-18 15:59 <a href="http://www.cppblog.com/elva/archive/2012/04/18/171874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 更新源签名错误 –BADSIG 40976EAF437D05B5</title><link>http://www.cppblog.com/elva/archive/2012/02/18/165876.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Fri, 17 Feb 2012 19:10:00 GMT</pubDate><guid>http://www.cppblog.com/elva/archive/2012/02/18/165876.html</guid><wfw:comment>http://www.cppblog.com/elva/comments/165876.html</wfw:comment><comments>http://www.cppblog.com/elva/archive/2012/02/18/165876.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/elva/comments/commentRss/165876.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/elva/services/trackbacks/165876.html</trackback:ping><description><![CDATA[<div><h1><a href="http://www.linuxbyte.org/ubuntu-geng-xin-yuan-qian-ming-cuo-wu-badsig-40976eaf437d05b5.html" rel="bookmark" title="Permanent Link: Ubuntu 更新源签名错误 &#8211;BADSIG 40976EAF437D05B5">Ubuntu 更新源签名错误 &#8211;BADSIG 40976EAF437D05B5</a></h1> 			<p>2011-02-19 xiao H Posted in <a href="http://www.linuxbyte.org/category/%e7%b3%bb%e7%bb%9f%e7%ae%a1%e7%90%86" title="查看 系统管理 中的全部文章" rel="category tag">系统管理</a>   <a href="http://www.jiathis.com/share/?uid=900752" target="_blank"><img src="http://www.linuxbyte.org/jiathis.gif" border="0"  alt="" /></a>   </p> 	 				<p>错误提示：</p>  <div><div><pre style="font-family:monospace;">GPG 错误：http://mirrors.163.com maverick-updates Release: 下列签名无效： BADSIG 40976EAF437D05B5 Ubuntu Archive Automatic Signing Key <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ftpmaster</span> @ubuntu.com<span style="color: #000000; font-weight: bold;">&gt;</span></span> <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ftpmaster<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>  <div>   </div><br /> 修复方法  <div><div><pre style="font-family:monospace;">gpg <span style="color: #660033;">--keyserver</span> keyserver.ubuntu.com <span style="color: #660033;">--recv</span> 40976EAF437D05B5 gpg <span style="color: #660033;">--export</span> <span style="color: #660033;">--armor</span> 40976EAF437D05B5 <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-key</span> add -</pre></div></div>  <p>上面的方法不行可以试试下面这个</p>  <div><div><pre style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> <span style="color: #660033;">-o</span> Acquire::http::No-Cache=True <span style="color: #660033;">-o</span> Acquire::<span style="color: #007800;">BrokenProxy</span>=<span style="color: #c20cb9; font-weight: bold;">true</span> update</pre></div></div>  <p>终极大法</p>  <div><div><pre style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> clean <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>apt <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mv</span> lists lists.old <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> lists<span style="color: #000000; font-weight: bold;">/</span>partial <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> clean <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> update</pre></div></div>  <p>以上方法来自：</p> <p>http://forum.ubuntu.org.</p></div><br /><br />转自：<br /><div>http://www.linuxbyte.org/ubuntu-geng-xin-yuan-qian-ming-cuo-wu-badsig-40976eaf437d05b5.html</div><img src ="http://www.cppblog.com/elva/aggbug/165876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/elva/" target="_blank">叶子</a> 2012-02-18 03:10 <a href="http://www.cppblog.com/elva/archive/2012/02/18/165876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux无法登录，显示module is unknown</title><link>http://www.cppblog.com/elva/archive/2012/01/06/163709.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Fri, 06 Jan 2012 04:35:00 GMT</pubDate><guid>http://www.cppblog.com/elva/archive/2012/01/06/163709.html</guid><wfw:comment>http://www.cppblog.com/elva/comments/163709.html</wfw:comment><comments>http://www.cppblog.com/elva/archive/2012/01/06/163709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/elva/comments/commentRss/163709.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/elva/services/trackbacks/163709.html</trackback:ping><description><![CDATA[<div>今天在配置Oracle安装环境时，更改了一些系统参数，注销重新登录时发现即使输入正确的用户名和密码，也无法登录，在按回车的那一瞬间可以看到密码下方有一行快速闪过的提示&#8220;module is unknown&#8221;。不解何意。 <p>&nbsp;&nbsp;&nbsp; 本人的系统默认是命令行界面启动的。于是重启以RunLevel 5进入图形界面。发现图形界面可以正常进入。下面就查询日志吧：</p> <div> <pre>   1:  # cd /var/log/</pre> <pre>   2:  #cat security </pre> </div>   <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:93ebaf94-94cb-43ef-9431-ab7c7cce5a9e"><a href="http://www.zhaofengcao.com/wp-content/uploads/2011/08/Log8x6.jpg" title="" rel="thumbnail"><img src="http://www.zhaofengcao.com/wp-content/uploads/2011/08/Log.png" height="265" border="0" width="335"  alt="" /></a></div> <p>在日志文件中，我看到了如下信息：</p> <p>PAM unable to dlopen(/lib/security/pam_limits.so)</p> <p>PAM [error: /lib/security/pam_limits.so: wrong ELF class: ELFCLASS32]</p> <p>PAM adding faulty module: /lib/security/pam_limits.so</p> <p>pam_unix(login:session): session opened for user Oracle by LOGIN(uid=0)</p> <p>Module is unknown</p> <p>看到这里，我想起我在/etc/pam.d/login中加入了:</p> <p>session required /lib/security/pam_limits.so</p> <p>session required pam_limits.so</p> <p>两条配置语句。根据日志信息以上Login上的其他配置信息，将第一条语句注释掉：<br />   </p> <p>#session required /lib/security/pam_limits.so</p> <p>session required pam_limits.so</p> <p>重启，登录，一切正常。问题解决》</p> <p>########################更新##########################33</p> <p>以上问题的出现是由于操作系统的问题。我本想安装32位centos，结果错手拿了一个64bit Centos安装，然后按照32位的配置进行了配置。正确配置在64位下应为：</p> <div> <pre>   1:  session required /lib64/security/pam_limits.so</pre> <pre>   2:  &nbsp;</pre> <pre>   3:  session required pam_limits.so</pre> </div>  </div><br /><br />转自：<div>http://www.zhaofengcao.com/archives/138</div><img src ="http://www.cppblog.com/elva/aggbug/163709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/elva/" target="_blank">叶子</a> 2012-01-06 12:35 <a href="http://www.cppblog.com/elva/archive/2012/01/06/163709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>__attribute__((deprecated))</title><link>http://www.cppblog.com/elva/archive/2011/12/28/162998.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Wed, 28 Dec 2011 12:26:00 GMT</pubDate><guid>http://www.cppblog.com/elva/archive/2011/12/28/162998.html</guid><wfw:comment>http://www.cppblog.com/elva/comments/162998.html</wfw:comment><comments>http://www.cppblog.com/elva/archive/2011/12/28/162998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/elva/comments/commentRss/162998.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/elva/services/trackbacks/162998.html</trackback:ping><description><![CDATA[RealView 编译工具 编译器参考指南<br /><br />
<div lang="en" class="sect2" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a id="Caccahah"></a>4.5.4. <code class="literal">__attribute__((deprecated))</code></h3></div></div></div>
<p>可以使用 <code class="literal">deprecated</code> 变量属性声明不提倡使用的变量，而不会导致编译器发出任何警告或错误。但是，对 <code class="literal">deprecated</code> 变量的任何访问都会生成警告，但仍会进行编译。警告指出了使用和定义变量的位置。这有助于确定不提倡使用特定定义的原因。</p>
<div class="note">
<h3 class="note">Note</h3>
<p>此变量属性是 ARM 编译器支持的 GNU 编译器扩展。</p></div>
<div lang="en" class="sect3" xml:lang="en">
<div class="titlepage">
<div>
<div>
<h4 class="title"><a id="id4851969"></a>示例</h4></div></div></div><pre class="programlisting">extern int Variable_Attributes_deprecated_0 __attribute__ ((deprecated));
extern int Variable_Attributes_deprecated_1 __attribute__ ((deprecated));
void Variable_Attributes_deprecated_2()
{
    Variable_Attributes_deprecated_0=1;
    Variable_Attributes_deprecated_1=2;
}
</pre>
<p>编译此示例时，将生成两条警告消息。</p></div></div>
<div class="footers">
<table class="legalfooter" border="0" cellspacing="0" summary="Legal information footer" cellpadding="0" width="100%">
<tbody>
<tr class="copyrightdocnumbar">
<td class="copyrightcell" valign="top" align="left">Copyright &#169; 2007-2009 ARM Limited. All rights reserved.</td>
<td class="docnumcell" valign="top" align="right">ARM DUI 0348BC</td></tr>
<tr class="secstatusbar">
<td class="securitycell" valign="top" align="left">Non-Confidential</td></tr>
<tr class="pdflinkbar">
<td class="pdflinkcell" valign="top" colspan="2" align="center"><a href="http://infocenter.arm.com/help/topic/com.arm.doc.dui0348bc/DUI0348BC_rvct_comp_ref_guide.pdf" rel="nofollow" target="_blank"><img border="0" alt="PDF file icon" src="http://infocenter.arm.com/help/topic/com.arm.doc.common/images/pdficon_small.gif" /> PDF version</a></td></tr></tbody></table></div><br /><br /><br />转载自：<br /><a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0348bc/Caccahah.html">http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0348bc/Caccahah.html</a><img src ="http://www.cppblog.com/elva/aggbug/162998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/elva/" target="_blank">叶子</a> 2011-12-28 20:26 <a href="http://www.cppblog.com/elva/archive/2011/12/28/162998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>/dev/sdc is apparently in use by the system; will not make a filesystem here! </title><link>http://www.cppblog.com/elva/archive/2011/11/22/160717.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Tue, 22 Nov 2011 08:20:00 GMT</pubDate><guid>http://www.cppblog.com/elva/archive/2011/11/22/160717.html</guid><wfw:comment>http://www.cppblog.com/elva/comments/160717.html</wfw:comment><comments>http://www.cppblog.com/elva/archive/2011/11/22/160717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/elva/comments/commentRss/160717.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/elva/services/trackbacks/160717.html</trackback:ping><description><![CDATA[<div class="smallfont"><strong>Re: /dev/sdc is apparently in use by the system; will not make a filesystem here!</strong> </div>
<hr style="background-color: #ffffff; color: #ffffff" size="1" />

<!-- / icon and title --><!-- message -->

<div id="post_message_11225690" class="vbclean_msgtext">
<div style="margin: 5px 20px 20px">
<div style="margin-bottom: 2px" class="smallfont">Quote:</div>
<table border="0" cellspacing="0" cellpadding="6" width="100%">
<tbody>
<tr>
<td class="ubuntu_quotebackground">
<div>Originally Posted by <strong>abriejo</strong> <a href="http://ubuntuforums.org/showthread.php?p=5486933#post5486933" rel="nofollow"><img class="inlineimg" title="View Post" border="0" alt="View Post" src="http://ubuntuforums.org/images/buttons/viewpost.gif" /></a> </div>
<div style="font-style: italic">Hi<br /><br />I was about to try the CD startup when I tried one last thing again.<br /><br />sudo mdadm --stop /dev/md0<br /><br />It worked, but I find it strange because I did it before and md0 did not appear in the fdisk -l screen.<br /><br />Immdiately after that I was able to run the sudo mkfs.ext3 /dev/sdc <br /><br /><br />Maybe it is because I ran the zero-superblock tasks overnight - something that made me nervous, since I have no idea what it does.<br /><br />Than You for your help!</div></td></tr></tbody></table></div><br />It worked for me. Thanks!</div><!-- / message --><img src ="http://www.cppblog.com/elva/aggbug/160717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/elva/" target="_blank">叶子</a> 2011-11-22 16:20 <a href="http://www.cppblog.com/elva/archive/2011/11/22/160717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gdb中忽略信号处理</title><link>http://www.cppblog.com/elva/archive/2011/11/01/159457.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Tue, 01 Nov 2011 06:46:00 GMT</pubDate><guid>http://www.cppblog.com/elva/archive/2011/11/01/159457.html</guid><wfw:comment>http://www.cppblog.com/elva/comments/159457.html</wfw:comment><comments>http://www.cppblog.com/elva/archive/2011/11/01/159457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/elva/comments/commentRss/159457.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/elva/services/trackbacks/159457.html</trackback:ping><description><![CDATA[<div>信号（Signals）<br /> <br /> 信号是一种软中断，是一种处理异步事件的方法。一般来说，操作系统都支持许多信号。尤其是UNIX，比较重要应用程序一般都会处理信号。UNIX定义了许 多信号，比如SIGINT表示中断字符信号，也就是Ctrl+C的信号，SIGBUS表示硬件故障的信号；SIGCHLD表示子进程状态改变信号； SIGKILL表示终止程序运行的信号，等等。信号量编程是UNIX下非常重要的一种技术。<br /> <br /> GDB有能力在你调试程序的时候处理任何一种信号，你可以告诉GDB需要处理哪一种信号。你可以要求GDB收到你所指定的信号时，马上停住正在运行的程序，以供你进行调试。你可以用GDB的handle命令来完成这一功能。<br /> <br /> handle<br /> 在GDB中定义一个信号处理。信号可以以SIG开头或不以 SIG开头，可以用定义一个要处理信号的范围（如：SIGIO-SIGKILL，表示处理从SIGIO信号到SIGKILL的信号，其中包括SIGIO， SIGIOT，SIGKILL三个信号），也可以使用关键字all来标明要处理所有的信号。一旦被调试的程序接收到信号，运行程序马上会被GDB停住，以 供调试。其可以是以下几种关键字的一个或多个。<br /> <br /> nostop<br /> 当被调试的程序收到信号时，GDB不会停住程序的运行，但会打出消息告诉你收到这种信号。<br /> stop<br /> 当被调试的程序收到信号时，GDB会停住你的程序。<br /> print<br /> 当被调试的程序收到信号时，GDB会显示出一条信息。<br /> noprint<br /> 当被调试的程序收到信号时，GDB不会告诉你收到信号的信息。<br /> pass<br /> noignore<br /> 当被调试的程序收到信号时，GDB不处理信号。这表示，GDB会把这个信号交给被调试程序会处理。<br /> nopass<br /> ignore<br /> 当被调试的程序收到信号时，GDB不会让被调试程序来处理这个信号。<br /> <br /> <br /> info signals<br /> info handle<br /> 查看有哪些信号在被GDB检测中。 		 		 		</div><br />另外补充：<br /><div><span style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span style="font-size: 13px; color: #333333; line-height: 21px"> <p><strong>信号的处理</strong><br /> 程序是和网络相关的，调试期间经常地收到SIGPIPE，导致gdb停下来。看了一下gdb info，解决方法很简单。用handle命令设置一下缺省signal的处理行为就可以了:<code><br /> &nbsp;&nbsp; handle SIGPIPE nostop<br /> </code>如果连提示信息都不想看见，就可以这样设置:<code><br /> &nbsp;&nbsp; handle SIGPIPE nostop noprint<br /> </code>就可以了。其他相关信号也可以类似处理。想了解目前的signal状态可以使用<code>info signal</code>察看。</p> <p><strong>启动配置文件</strong><br /> GDB使用中比较麻烦的事情，就是每次启动，还要手动敲一把命令，特别是断点比较多的情况，这个特便影响，工作效率。查了一下gdb  info，gdb支持自动读取一个启动脚本文件.gdbinit，所以经常输入的启动命令，就都可以写在gdb启动目录的.gdbinit里面。比如<code><br /> .gdbinit:<br /> &nbsp;&nbsp; file myapp<br /> &nbsp;&nbsp; handle SIGPIPE nostop<br /> &nbsp;&nbsp; break ss.c:100<br /> &nbsp;&nbsp; break ss.c:200<br /> &nbsp;&nbsp; run<br /> </code>GDB和bash类似，也支持source这个命令，执行另外一个脚本文件。所以可以修改一下.gdbinit:<code><br /> .gdbinit:<br /> &nbsp;&nbsp; file myapp<br /> &nbsp;&nbsp; handle SIGPIPE nostop<br /> &nbsp;&nbsp; source gdb.break<br /> &nbsp;&nbsp; run<br /> gdb.break:<br /> &nbsp;&nbsp; break ss.c:100<br /> &nbsp;&nbsp; break ss.c:200<br /> </code>这样修改的断点配置，只需要编辑gdb.break就可以了。再后来，偶而还是需要单独启动GDB，不想执行自动脚本，于是又改进了一下。首先把.gdbinit命名为gdb.init，然后定义一个shell alias:<code><br /> &nbsp;&nbsp; $ alias .gdb=&#8221;gdb -x gdb.init&#8221;</code></p> <p>这样如果需要使用自动脚本，就用.gdb命令，否则用gdb进入交互状态的gdb。这样配置以后可以一个简单命令就开始调试，整个效率就能提高不少。</p> <p>注:转自<a style="font-weight: normal; font-size: 12px; color: #003300; line-height: 1.6em; text-decoration: none" href="http://blog.scaner.i.thu.cn/index.php/2006/04/15/gdb-tips-1/">http://blog.scaner.i.thu.cn/index.php/2006/04/15/gdb-tips-1/</a></p> <p>注解</p> <p>1<code>alias命令</code></p> <p><code><code>alias</code>顾名思义就是起别名的意思，在linux里，可以通过alias命令为常用命令设置快捷方式,命令格式如下： alias name='command' 例如：alias del='rm'</code></p> <div> <p>欲显示系统已有别名，直接使用 alias或alias -p</p> <p>若需要设置的命令别名比较多，可以直接修改/etc/bashrc或~/.bashrc，将需要的别名写到里面即可，不同之处是/etc/bashrc设置的别名对于所有登录用户都起作用，而~/.bashrc只对目前用户起作用。</p> </div> </span></span></div><img src ="http://www.cppblog.com/elva/aggbug/159457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/elva/" target="_blank">叶子</a> 2011-11-01 14:46 <a href="http://www.cppblog.com/elva/archive/2011/11/01/159457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图像、帧、片、NALU</title><link>http://www.cppblog.com/elva/archive/2011/02/24/140579.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Thu, 24 Feb 2011 04:10:00 GMT</pubDate><guid>http://www.cppblog.com/elva/archive/2011/02/24/140579.html</guid><wfw:comment>http://www.cppblog.com/elva/comments/140579.html</wfw:comment><comments>http://www.cppblog.com/elva/archive/2011/02/24/140579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/elva/comments/commentRss/140579.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/elva/services/trackbacks/140579.html</trackback:ping><description><![CDATA[<div>图像、帧、片、NALU 是学习 H.264 的人常常感到困惑的一些概念，我在这里对自己的理解做一些阐述，欢迎大家讨论：<br><br><br>H.264 是一次概念的革新，它打破常规，<strong>完全没有 I 帧、P帧、B 帧的概念，也没有 IDR 帧的概念</strong>。对于 H.264 中出现的一些概念从大到小排序依次是：<strong>序列、图像、片组、片、NALU、宏块、亚宏块、块、像素</strong>。这里有几点值得说明：<br>（1）、在 H.264 协议中<strong>图像是个集合概念</strong>，顶<strong>场、底场、帧都可以称为图像</strong>（本文图像概念时都是集合概念）。因此我们可以知道，对于 H.264 协议来说，我们平常所熟悉的那些称呼，例如：<strong>I 帧、P 帧、B 帧等等，实际上都是我们把图像这个概念具体化和细小化了</strong>。我们<strong>在 H.264 里提到的&#8220;帧&#8221;通常就是指不分场的图像；<br></strong>（2）、如果<strong>不采用 FMO（灵活宏块排序）</strong> 机制，则<strong>一幅图像只有一个片组</strong>；<br>（3）、如果<strong>不使用多个片，则一个片组只有一个片</strong>；<br>（4）、如果<strong>不采用</strong> DP（<strong>数据分割</strong>）机制，则<strong>一个片就是一个 NALU</strong>，<strong>一个 NALU 也就是一个片</strong>。</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 否则，<strong>一个片由 三个 NALU 组成</strong>（即标准&#8220;表7-1&#8221;中 nal_unit_type 值为 2、3、4 的<strong>三个</strong> NALU 属于 一个片）； &nbsp;</div>
<div><strong>&nbsp;&nbsp; 2 编码条带数据分割块A&nbsp; slice_data_partition_a_layer_rbsp( )<br><br>&nbsp;&nbsp; 3 编码条带数据分割块B slice_data_partition_b_layer_rbsp( )<br><br>&nbsp;&nbsp; 4 编码条带数据分割块C slice_data_partition_c_layer_rbsp( )</strong></div>
<div>&nbsp;</div>
<div>（5）、以上所述的<strong>片和 NALU 的大小关系并不是抽象概念上的从属关系</strong>。从概念的<strong>从属关系</strong>上来看，<strong>NALU</strong>其实<strong>又是片的一个集合概念</strong>，例如：标准&#8220;表7-1&#8221;中 nal_unit_type 值为 5 的 NALU 包括 <strong>I 片或者 SI 片。<br></strong><br>&nbsp;&nbsp;&nbsp; <strong>一幅图像根据组成它的片类型来分</strong>，可以分为标准<strong>&#8220;表7-5&#8221;中的 8 种类型</strong>。我们平常应用中所最常见到的<strong>其实是这些类型</strong>的特例。例如：<strong>我们平常所谓的&#8220;I 帧&#8221;和&#8220;IDR 帧&#8221;，</strong>其实是 <strong>primary_pic_type 值为 0 的图像</strong>，我们平常所谓的&#8220;<strong>P帧&#8221;其实是 primary_pic_type 值为 1 的图像的特例</strong>，<strong>我们平常所谓的&#8220;B帧&#8221;其实是 primary_pic_type 值为 2 的图像的特例。<br></strong><br>&nbsp;&nbsp;&nbsp; <strong>一幅图像根据概念来分可以分为两种</strong>：<strong>IDR 图像和非 IDR 图像</strong>。一幅图像是否是 <strong>IDR 图像</strong>是由组成该<strong>图像的 NALU 决定的</strong>，如果组<strong>成该图像的 NALU 为标准&#8220;表7-1&#8221;中 nal_unit_type 值为 5 的 NALU</strong>，则该<strong>图像为 IDR 图像</strong>，否则为<strong>非 IDR 图像</strong>。这里也有几点值得说明：<br></div>
<div><strong>（1）、nal_unit_type 值为 5 的 NALU 只会出现在 IDR 图像中，而 IDR 图像中的所有 NALU 都是nal_unit_type 值为 5 的 NALU；<br></strong>（2）、我们以组成一<strong>幅图像的片的类型</strong>来区分该<strong>图像是否是 IDR 图像是错误</strong>的。</div>
<div>例如：<strong>一幅图像中的所有片都是 I 片并不代表这幅图像就是 IDR 图像</strong>。因为 I 片也可以从属于 nal_unit_type 值为 1 的 NALU <span style="COLOR: red">也即非IDR图像有可能全部包含I片</span>。只不过我们平常最常见到的形式是：所有片都是 I 片的图像就是 IDR 图像。其实这个时候 <strong>IDR 图像</strong>的概念也被我们具体化和细小化了。 <span style="COLOR: red">但IDR图像必定全部包含I片或SI片，不过<strong>只有用NALU的类型才能判断是不是IDR图像</strong></span><br><br>一幅图像由 <strong>1～N 个片组</strong>组成，而<strong>每一个片组</strong>又由一个或<strong>若干个片</strong>组成 <span style="COLOR: red">一个片由一个NALU或三个NALU（假如有数据分割）组成</span>。<strong>图像解码过程中总是按照片进行解码</strong>，然后按照片组将解码宏块重组成图像。从这种意义上讲，<strong>片实际是最大的解码单元</strong>。</div>
<div>&nbsp;</div>
<div><strong>一个片又包含哪些类型的宏块呢？</strong></div>
<div><strong>标准&#8220;表7-10&#8221;做了最好的说明。</strong></div>
<div>&nbsp;</div>
<div><strong>一个 I 宏块又分为哪些类型呢？</strong></div>
<div><strong>标准&#8220;表7-11&#8221;做了最好的说明。</strong></div>
<div>&nbsp;</div>
<div><strong>一个 P 宏块又分为哪些类型呢？</strong></div>
<div><strong>标准&#8220;表7-13&#8221;做了最好的说明。</strong></div>
<div>&nbsp;</div>
<div><strong>一个 B 宏块又分为哪些类型呢？</strong></div>
<div><strong>标准&#8220;表7-14&#8221;做了最好的说明。</strong></div>
<div>&nbsp;</div>
<div><strong>一个 P 宏块的亚宏块又分为哪些类型呢？</strong></div>
<div><strong>标准&#8220;表7-17&#8221;做了最好的说明。</strong></div>
<div>&nbsp;</div>
<div><strong>一个 B 宏块的亚宏块又分为哪些类型呢？</strong></div>
<div><strong>标准&#8220;表7-18&#8221;做了最好的说明。</strong></div>
<img src ="http://www.cppblog.com/elva/aggbug/140579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/elva/" target="_blank">叶子</a> 2011-02-24 12:10 <a href="http://www.cppblog.com/elva/archive/2011/02/24/140579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>