<?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/"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>youtube 归档 - Tinyfool的个人网站</title>
	<atom:link href="https://codechina.org/tag/youtube/feed/" rel="self" type="application/rss+xml" />
	<link>https://codechina.org/tag/youtube/</link>
	<description></description>
	<lastBuildDate>Mon, 29 Jan 2024 15:44:31 +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>PHP如何解析Youtube的RSS【ChatGPT】</title>
		<link>https://codechina.org/2024/01/30634/</link>
					<comments>https://codechina.org/2024/01/30634/#respond</comments>
		
		<dc:creator><![CDATA[tinyfool]]></dc:creator>
		<pubDate>Mon, 29 Jan 2024 15:44:29 +0000</pubDate>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[youtube]]></category>
		<guid isPermaLink="false">https://codechina.org/?p=30634</guid>

					<description><![CDATA[<p>最近我想把我的油管视频的RSS引入到我的其他网站，比如OurCoders里。这本来应该不难。本来OurCode [&#8230;]</p>
<p><a href="https://codechina.org/2024/01/30634/">PHP如何解析Youtube的RSS【ChatGPT】</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>最近我想把我的油管视频的RSS引入到我的其他网站，比如<a href="https://ourcoders.com/">OurCoders</a>里。这本来应该不难。本来OurCoders的代码里面就包含了<a href="https://magpierss.sourceforge.net/">magpierss</a>，这是一个古老的PHP RSS解析库，但是一直都可以用。</p>



<span id="more-30634"></span>



<p>但是今天发现，magpirerss解析不出来，这是因为Youtube的RSS其实跟规范不完全统一，不够合法。之前即使magpirerss可以解析的时候，有些部分的解析也是不完全对的，我还需要写代码来调整解析后的结果。</p>



<p>今天又解析不出来了，于是我干脆想换一个新的RSS解析器吧，毕竟这个都10多年没更新的，有些Bug也没人解决。于是我找到了<a href="https://github.com/dg/rss-php">rss-php</a>。安装rss-php，很容易，它支持composer。安装方法是：</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">composer require dg/rss-php</code></pre>



<p>使用方法也很简单：</p>



<pre class="wp-block-code"><code lang="php" class="language-php">$rss = Feed::loadRss($url);

echo 'Title: ', $rss-&gt;title;
echo 'Description: ', $rss-&gt;description;
echo 'Link: ', $rss-&gt;url;

foreach ($rss-&gt;item as $item) {
	echo 'Title: ', $item-&gt;title;
	echo 'Link: ', $item-&gt;url;
	echo 'Timestamp: ', $item-&gt;timestamp;
	echo 'Description ', $item-&gt;description;
	echo 'HTML encoded content: ', $item-&gt;{'content:encoded'};
}</code></pre>



<p>但是可怕的是换了rss-php还是无法解析。我就想干脆单独自己写解析Youtube RSS的代码吧。</p>



<p>下面是YoutubeRSS的例子：</p>



<pre class="wp-block-code"><code lang="xml" class="language-xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;feed xmlns:yt="http://www.youtube.com/xml/schemas/2015" xmlns:media="http://search.yahoo.com/mrss/" xmlns="http://www.w3.org/2005/Atom"&gt;
 &lt;link rel="self" href="http://www.youtube.com/feeds/videos.xml?channel_id=UCdhngtoCb1xRmJQqkS5DpfA"/&gt;
 &lt;id&gt;yt:channel:dhngtoCb1xRmJQqkS5DpfA&lt;/id&gt;
 &lt;yt:channelId&gt;dhngtoCb1xRmJQqkS5DpfA&lt;/yt:channelId&gt;
 &lt;title&gt;Tinyfool的胡说八道&lt;/title&gt;
 &lt;link rel="alternate" href="https://www.youtube.com/channel/UCdhngtoCb1xRmJQqkS5DpfA"/&gt;
 &lt;author&gt;
  &lt;name&gt;Tinyfool的胡说八道&lt;/name&gt;
  &lt;uri&gt;https://www.youtube.com/channel/UCdhngtoCb1xRmJQqkS5DpfA&lt;/uri&gt;
 &lt;/author&gt;
 &lt;published&gt;2019-03-26T02:06:01+00:00&lt;/published&gt;
 &lt;entry&gt;
  &lt;id&gt;yt:video:0u_rS0CfhFc&lt;/id&gt;
  &lt;yt:videoId&gt;0u_rS0CfhFc&lt;/yt:videoId&gt;
  &lt;yt:channelId&gt;UCdhngtoCb1xRmJQqkS5DpfA&lt;/yt:channelId&gt;
  &lt;title&gt;军事是不是科技大发展的原动力？老范、徐凯和Tinyfool三人谈&lt;/title&gt;
  &lt;link rel="alternate" href="https://www.youtube.com/watch?v=0u_rS0CfhFc"/&gt;
  &lt;author&gt;
   &lt;name&gt;Tinyfool的胡说八道&lt;/name&gt;
   &lt;uri&gt;https://www.youtube.com/channel/UCdhngtoCb1xRmJQqkS5DpfA&lt;/uri&gt;
  &lt;/author&gt;
  &lt;published&gt;2024-01-23T00:40:00+00:00&lt;/published&gt;
  &lt;updated&gt;2024-01-23T00:40:00+00:00&lt;/updated&gt;
  &lt;media:group&gt;
   &lt;media:title&gt;军事是不是科技大发展的原动力？老范、徐凯和Tinyfool三人谈&lt;/media:title&gt;
   &lt;media:content url="https://www.youtube.com/v/0u_rS0CfhFc?version=3" type="application/x-shockwave-flash" width="640" height="390"/&gt;
   &lt;media:thumbnail url="https://i1.ytimg.com/vi/0u_rS0CfhFc/hqdefault.jpg" width="480" height="360"/&gt;
   &lt;media:description&gt;成为此频道的会员即可获享以下福利：
https://www.youtube.com/channel/UCdhngtoCb1xRmJQqkS5DpfA/join


本视频字幕使用TinyStudio生成 https://tinystudio.ai/&lt;/media:description&gt;
   &lt;media:community&gt;
    &lt;media:starRating count="54" average="5.00" min="1" max="5"/&gt;
    &lt;media:statistics views="2065"/&gt;
   &lt;/media:community&gt;
  &lt;/media:group&gt;
 &lt;/entry&gt;
 &lt;entry&gt;
  &lt;id&gt;yt:video:kj8b3sJ_gJE&lt;/id&gt;
  &lt;yt:videoId&gt;kj8b3sJ_gJE&lt;/yt:videoId&gt;
  &lt;yt:channelId&gt;UCdhngtoCb1xRmJQqkS5DpfA&lt;/yt:channelId&gt;
  &lt;title&gt;老范采访我，问我为啥要做游戏&lt;/title&gt;
  &lt;link rel="alternate" href="https://www.youtube.com/watch?v=kj8b3sJ_gJE"/&gt;
  &lt;author&gt;
   &lt;name&gt;Tinyfool的胡说八道&lt;/name&gt;
   &lt;uri&gt;https://www.youtube.com/channel/UCdhngtoCb1xRmJQqkS5DpfA&lt;/uri&gt;
  &lt;/author&gt;
  &lt;published&gt;2024-01-21T01:00:20+00:00&lt;/published&gt;
  &lt;updated&gt;2024-01-21T01:00:20+00:00&lt;/updated&gt;
  &lt;media:group&gt;
   &lt;media:title&gt;老范采访我，问我为啥要做游戏&lt;/media:title&gt;
   &lt;media:content url="https://www.youtube.com/v/kj8b3sJ_gJE?version=3" type="application/x-shockwave-flash" width="640" height="390"/&gt;
   &lt;media:thumbnail url="https://i4.ytimg.com/vi/kj8b3sJ_gJE/hqdefault.jpg" width="480" height="360"/&gt;
   &lt;media:description&gt;成为此频道的会员即可获享以下福利：
https://www.youtube.com/channel/UCdhngtoCb1xRmJQqkS5DpfA/join


本视频字幕使用TinyStudio生成 https://tinystudio.ai/&lt;/media:description&gt;
   &lt;media:community&gt;
    &lt;media:starRating count="54" average="5.00" min="1" max="5"/&gt;
    &lt;media:statistics views="2452"/&gt;
   &lt;/media:community&gt;
  &lt;/media:group&gt;
 &lt;/entry&gt;

&lt;/feed&gt;</code></pre>



<p>但是写起来好麻烦啊。对啊，我们有 ChatGPT，万事不决问ChatGPT，于是我写下了如下的Prompt：</p>



<pre class="wp-block-preformatted">如下的xml，我希望读取每个<code>entry</code>的id，title，link，published，updated，media:thumbnail，media:description等信息，用PHP如何获得 </pre>



<p>ChatGPT回复道：</p>



<pre class="wp-block-preformatted">使用SimpleXML扩展可以轻松地解析这样的XML。但请注意，由于XML具有命名空间，因此需要在处理元素和属性时指定它们。以下是如何用SimpleXML读取每个&lt;entry>的id，title，link，published，updated，media:thumbnail，media:description等信息： </pre>



<pre class="wp-block-code"><code lang="php" class="language-php">&lt;?php
$xmlString = '...'; // 这里放你的原始XML字符串
$xml = simplexml_load_string($xmlString);
$xml->registerXPathNamespace('media', 'http://search.yahoo.com/mrss/');
$xml->registerXPathNamespace('yt', 'http://www.youtube.com/xml/schemas/2015');

foreach ($xml->entry as $entry) {
    $id = (string)$entry->id; // 或者使用 $entry->children('yt', true)->videoId
    $title = (string)$entry->title;
    $link = (string)$entry->link->attributes()->href;
    $published = (string)$entry->published;
    $updated = (string)$entry->updated;
    
    // 获取媒体信息
    $mediaGroup = $entry->children('media', true)->group;
    $mediaThumbnail = (string)$mediaGroup->thumbnail->attributes()->url;
    $mediaDescription = (string)$mediaGroup->description;
    
    // 输出信息
    echo "ID: $id\n";
    echo "Title: $title\n";
    echo "Link: $link\n";
    echo "Published on: $published\n";
    echo "Updated on: $updated\n";
    echo "Thumbnail: $mediaThumbnail\n";
    echo "Description: $mediaDescription\n";
    echo "----------------------\n";
}
?></code></pre>



<pre class="wp-block-preformatted">这段代码首先加载了XML字符串到$xml变量。然后，我们使用registerXPathNamespace()函数来注册XML中使用的命名空间。这对于正确解析media:和yt:前缀的元素至关重要。接着，代码遍历了&lt;entry>标签中的每一个条目，提取和打印了所需的信息。 请注意，由于含有冒号（:）的XML元素属于名称空间，我们需要使用children()方法来访问它们。SimpleXML中的attributes()方法被用于获取元素的属性。 这段代码提供了一个基本的框架，可能需要根据实际XML结构或者特定需求进行适当的调整。同时，确保输入的XML字符串是完整和有效的，这里出于示例缩短了字符串内容。</pre>



<p>问题解决了</p>
<p><a href="https://codechina.org/2024/01/30634/">PHP如何解析Youtube的RSS【ChatGPT】</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codechina.org/2024/01/30634/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			<media:content url="https://codechina.org/wp-content/uploads/2024/01/截屏2024-01-29-23.38.21.png" medium="image" />
	</item>
		<item>
		<title>在Mac上用FFMpeg做youtube上传视频的预处理</title>
		<link>https://codechina.org/2024/01/30609/</link>
					<comments>https://codechina.org/2024/01/30609/#comments</comments>
		
		<dc:creator><![CDATA[tinyfool]]></dc:creator>
		<pubDate>Mon, 01 Jan 2024 06:41:33 +0000</pubDate>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[youtube]]></category>
		<guid isPermaLink="false">https://codechina.org/?p=30609</guid>

					<description><![CDATA[<p>大家知道我有好几个 Youtube 频道，目前主频道是Tinyfool的胡说八道。 我现在有几种视频拍摄方式， [&#8230;]</p>
<p><a href="https://codechina.org/2024/01/30609/">在Mac上用FFMpeg做youtube上传视频的预处理</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>大家知道我有好几个 Youtube 频道，目前主频道是<a href="http://youtube.com/channel/ucdhngtocb1xrmjqqks5dpfa/">Tinyfool的胡说八道。</a></p>



<p>我现在有几种视频拍摄方式，其中一种主要的是用 Mac 的 QuickTime player 来录制，录制高品质的版本生成的 .mov 文件，文件非常大。</p>



<p>我最近录制的一个视频有48分钟，1080p的，文件尺寸足有51G。直接上传到 Youtube 也可以，但是实际上 Youtube 也会把你上传的视频进行压缩，所以，事先先压缩可以节约大量的翻墙流量。</p>



<p>于是我研究了一下 <a href="https://codechina.org/2020/02/ffmpeg-usage/">FFMpeg</a> 的命令，用下面的命令来做压缩：</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash"><code>ffmpeg -i input.mov -vcodec h264 -acodec mp2 -vf scale=-1:1080 output.mp4</code></code></pre>



<ul class="wp-block-list">
<li><code>-vcodec h264</code> 是因为 Youtube 内置的视频格式是 .h264</li>



<li><code>-acodec mp2</code> 是因为 Youtube 内置的音频格式是 mp2</li>



<li>原视频是 1080p 的，用 <code>-vf scale=-1:1080</code> 是为了保护分辨率不被篡改。这些参数的结果是上传到 FFMpeg 以后不会有更近一步的压缩，节省了上传后的处理时间。</li>
</ul>



<p>用了一些日子，效果非常不错。</p>



<p>但是这个转换速度很慢，耗时很长，我今天又研究了一下。在压缩的时候，CPU 可以跑满，这说明这完全是一个软压缩。于是我寻找了一下， FFMpeg 如何在Mac下加速，原来加入 <code>-c:v h264_videotoolbox</code> 就可以了。于是命令变为：</p>



<pre class="wp-block-code"><code class="">ffmpeg -i input.mov -vcodec h264 -acodec mp2 -vf scale=-1:1080 -c:v h264_videotoolbox output.mp4</code></pre>



<p>在我的 Mac M1Max 笔记本上用新命令之前压缩 48 分钟的 51 G Mov文件需要 22分15秒，用了新命令，只需要12分钟1秒，省了大概一半的时间。</p>



<p>但是我发现用新命令的结果非常模糊，用 FFMpeg 检查文件发现，原来的 bitrate 是 2868 kb/s，新命令的结果 bitrate 是 716 kb/s。默认的压缩率太高了，所以看起来很模糊，于是我加入了一个新的参数，-b:v 2800k 限制 bitrate，然后压缩的结果就看起来没有任何问题了。而压缩速度几乎没变。所以，最后的命令如下：</p>



<pre class="wp-block-code"><code class="">ffmpeg -i input.mov -vcodec h264 -acodec mp2 -vf scale=-1:1080 -c:v h264_videotoolbox -b:v 2800k output.mp4</code></pre>



<p></p>
<p><a href="https://codechina.org/2024/01/30609/">在Mac上用FFMpeg做youtube上传视频的预处理</a>最先出现在<a href="https://codechina.org">Tinyfool的个人网站</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://codechina.org/2024/01/30609/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			<media:content url="https://codechina.org/wp-content/uploads/2024/01/FFmpeg-Ahmad-1024x576.jpg" medium="image" />
	</item>
	</channel>
</rss>
