<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[chunkuan]]></title> 
<atom:link href="https://jiachunkuan.com/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[留个脚印，仅此而已]]></description>
<link>https://jiachunkuan.com/</link>
<language>zh-cn</language>
<generator>emlog</generator>

<item>
    <title>MAC下如何使用python进行版本管理</title>
    <link>https://jiachunkuan.com/post-17.html</link>
    <description><![CDATA[<p><code>pyenv</code> 是一个优秀的 Python 版本管理工具，可以让你轻松地在多个 Python 版本之间切换。</p>
<h2>1. 安装 pyenv</h2>
<h3>通过 Homebrew 安装（推荐）：</h3>
<pre><code class="language-bash">brew update
brew install pyenv</code></pre>
<h3>配置 shell（添加到 shell 配置文件）：</h3>
<p>根据你的 shell 类型，将以下内容添加到配置文件（<code>~/.zshrc</code>、<code>~/.bashrc</code> 或 <code>~/.bash_profile</code>）：</p>
<pre><code class="language-bash"># 对于 zsh（macOS Catalina 及以后版本默认）
echo 'export PYENV_ROOT="$HOME/.pyenv"' &gt;&gt; ~/.zshrc
echo 'command -v pyenv &gt;/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' &gt;&gt; ~/.zshrc
echo 'eval "$(pyenv init -)"' &gt;&gt; ~/.zshrc

# 重新加载配置
source ~/.zshrc</code></pre>
<h2>2. 基本命令</h2>
<h3>查看可安装的 Python 版本：</h3>
<pre><code class="language-bash">pyenv install --list</code></pre>
<h3>安装特定 Python 版本：</h3>
<pre><code class="language-bash"># 安装指定版本
pyenv install 3.12.0
pyenv install 3.11.6
pyenv install 3.10.0

# 安装最新版本
pyenv install 3.13:latest</code></pre>
<h3>查看已安装的版本：</h3>
<pre><code class="language-bash">pyenv versions</code></pre>
<p>带 <code>*</code> 号的表示当前激活的版本。</p>
<h3>设置 Python 版本：</h3>
<pre><code class="language-bash"># 全局设置（影响整个系统）
pyenv global 3.11.6

# 局部设置（仅当前目录）
pyenv local 3.12.0

# 设置 shell 会话的临时版本
pyenv shell 3.10.0</code></pre>
<h2>3. 实际使用示例</h2>
<pre><code class="language-bash"># 1. 安装多个 Python 版本
pyenv install 3.9.18
pyenv install 3.10.13
pyenv install 3.11.6
pyenv install 3.12.0

# 2. 查看所有安装的版本
pyenv versions
# 输出示例：
#   system
# * 3.9.18 (set by /Users/username/.pyenv/version)
#   3.10.13
#   3.11.6
#   3.12.0

# 3. 设置全局默认版本
pyenv global 3.11.6

# 4. 为特定项目设置版本
cd myproject
pyenv local 3.12.0  # 会在目录下创建 .python-version 文件

# 5. 验证版本
python --version</code></pre>
<h2>4. 高级功能</h2>
<h3>使用虚拟环境插件（推荐）：</h3>
<pre><code class="language-bash"># 安装 pyenv-virtualenv 插件
brew install pyenv-virtualenv

# 配置（添加到 ~/.zshrc）
echo 'eval "$(pyenv virtualenv-init -)"' &gt;&gt; ~/.zshrc
source ~/.zshrc</code></pre>
<h3>创建和管理虚拟环境：</h3>
<pre><code class="language-bash"># 基于特定 Python 版本创建虚拟环境
pyenv virtualenv 3.11.6 myenv-3.11

# 激活虚拟环境
pyenv activate myenv-3.11

# 退出虚拟环境
pyenv deactivate

# 列出所有虚拟环境
pyenv virtualenvs

# 删除虚拟环境
pyenv uninstall myenv-3.11</code></pre>
<h3>项目自动化配置：</h3>
<pre><code class="language-bash"># 在项目目录中自动激活虚拟环境
cd myproject
pyenv local myproject-env
# 这样每次进入该目录会自动激活对应环境</code></pre>
<h2>5. 解决常见问题</h2>
<h3>安装 Python 时编译失败：</h3>
<pre><code class="language-bash"># 安装编译依赖
brew install openssl readline sqlite3 xz zlib

# 对于 macOS
export LDFLAGS="-L/usr/local/opt/zlib/lib"
export CPPFLAGS="-I/usr/local/opt/zlib/include"
export PKG_CONFIG_PATH="/usr/local/opt/zlib/lib/pkgconfig"</code></pre>
<h3>清理不需要的版本：</h3>
<pre><code class="language-bash"># 卸载 Python 版本
pyenv uninstall 3.8.0

# 清理已下载的安装文件
pyenv cache purge</code></pre>
<h2>6. 与系统 Python 共存</h2>
<pre><code class="language-bash"># 查看所有可用的 Python 命令
pyenv which python

# 重置为系统 Python
pyenv global system

# 设置版本优先级（比如：先用 3.11.6，找不到再用系统版本）
pyenv global 3.11.6 system</code></pre>
<h2>最佳实践建议：</h2>
<ol>
<li><strong>不要修改系统 Python</strong>，始终使用 pyenv 管理</li>
<li><strong>每个项目使用独立的虚拟环境</strong></li>
<li><strong>在项目根目录使用 <code>.python-version</code> 文件</strong>指定版本</li>
<li><strong>使用 <code>.envrc</code> 或 <code>Makefile</code></strong> 自动化环境设置</li>
<li><strong>定期更新 pyenv</strong>：<code>brew upgrade pyenv</code></li>
</ol>
<p>这样你就可以在不同项目中使用不同 Python 版本而不会相互干扰了！</p>]]></description>
    <pubDate>Tue, 13 Jan 2026 09:47:09 +0800</pubDate>
    <dc:creator>chunkuan</dc:creator>
    <guid>https://jiachunkuan.com/post-17.html</guid>
</item>
<item>
    <title>Linux 系统主机名修改方法（[root@iZuf6h6poz0angb0eqdr6nZ ~]）</title>
    <link>https://jiachunkuan.com/post-16.html</link>
    <description><![CDATA[<p><img src="https://jiachunkuan.com/content/uploadfile/202512/26611765859073.png" alt="" /></p>
<p>要修改Linux登录后的提示名（即终端提示符中的主机名），你需要修改 <strong>主机名（hostname）</strong>。这里有几种方法：</p>
<h2>方法一：临时修改（重启后失效）</h2>
<pre><code class="language-bash">hostname 新主机名</code></pre>
<p>例如：</p>
<pre><code class="language-bash">hostname myserver</code></pre>
<h2>方法二：永久修改（推荐）</h2>
<h3>1. 使用 <code>hostnamectl</code> 命令（CentOS 7+/Ubuntu 16.04+）</h3>
<pre><code class="language-bash"># 设置主机名
sudo hostnamectl set-hostname 新主机名

# 查看当前主机名
hostnamectl status</code></pre>
<h3>2. 编辑配置文件</h3>
<p>对于大多数Linux发行版，可以编辑以下文件：</p>
<pre><code class="language-bash"># CentOS/RHEL/Fedora
sudo vi /etc/hostname

# Ubuntu/Debian
sudo vi /etc/hostname</code></pre>
<p>将文件内容改为你想要的主机名，然后保存退出。</p>
<h3>3. 更新 hosts 文件</h3>
<p>还需要更新 <code>/etc/hosts</code> 文件，将旧主机名替换为新主机名：</p>
<pre><code class="language-bash">sudo vi /etc/hosts</code></pre>
<p>找到类似这样的行：</p>
<pre><code>127.0.0.1   localhost localhost.localdomain iZuf6h6poz0angb0eqdr6nZ</code></pre>
<p>将 <code>iZuf6h6poz0angb0eqdr6nZ</code> 替换为你的新主机名。</p>
<h2>方法三：使用交互式工具（某些发行版）</h2>
<pre><code class="language-bash">sudo hostnamectl set-hostname --static 新主机名
sudo hostnamectl set-hostname --pretty "可读的描述性名称"</code></pre>
<h2>示例：将主机名改为 myserver</h2>
<pre><code class="language-bash"># 1. 设置主机名
sudo hostnamectl set-hostname myserver

# 2. 编辑 hosts 文件
sudo vi /etc/hosts
# 修改为：127.0.1.1 myserver

# 3. 重新登录或打开新终端即可生效</code></pre>
<h2>立即生效</h2>
<p>修改后，你可以：</p>
<ol>
<li>重新登录系统</li>
<li>或执行：<code>exec bash</code> 或 <code>source ~/.bashrc</code>（取决于你的shell配置）</li>
<li>或直接打开新的终端窗口</li>
</ol>
<h2>注意事项</h2>
<ul>
<li>主机名通常只能包含字母、数字、连字符，不能有空格或特殊字符</li>
<li>某些云服务器（如阿里云）的实例ID在控制台显示不会改变，但SSH登录时的提示会变</li>
</ul>
<p>修改完成后，你的提示符就会从 <code>[root@iZuf6h6poz0angb0eqdr6nZ ~]#</code> 变成类似 <code>[root@myserver ~]#</code> 的样子。</p>]]></description>
    <pubDate>Tue, 16 Dec 2025 12:20:21 +0800</pubDate>
    <dc:creator>chunkuan</dc:creator>
    <guid>https://jiachunkuan.com/post-16.html</guid>
</item>
<item>
    <title>在 macOS 用 FFmpeg 命令行裁剪 MP3 文件</title>
    <link>https://jiachunkuan.com/post-15.html</link>
    <description><![CDATA[<p>在 macOS 命令行中裁剪 MP3 文件，最常用的工具是 <strong>FFmpeg</strong>。以下是详细的方法：</p>
<h2>1. 首先确保安装了 FFmpeg</h2>
<pre><code class="language-bash"># 使用 Homebrew 安装（推荐）
brew install ffmpeg

# 如果没有 Homebrew，先安装 Homebrew：
# /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"</code></pre>
<h2>2. 基本的 MP3 裁剪命令</h2>
<h3><strong>按时间裁剪（最常用）</strong></h3>
<pre><code class="language-bash"># 语法：
# ffmpeg -i 输入文件.mp3 -ss 开始时间 -to 结束时间 -c copy 输出文件.mp3
# 或使用 -t 表示持续时间

# 示例1：从第30秒裁剪到第1分30秒（时长1分钟）
ffmpeg -i input.mp3 -ss 00:00:30 -to 00:01:30 -c copy output.mp3

# 示例2：从第10秒开始，裁剪30秒时长
ffmpeg -i input.mp3 -ss 00:00:10 -t 00:00:30 -c copy output.mp3

# 示例3：简单的写法（分:秒）
ffmpeg -i input.mp3 -ss 0:30 -t 60 -c copy output.mp3</code></pre>
<h3><strong>参数说明：</strong></h3>
<ul>
<li><code>-ss HH:MM:SS</code> 或 <code>-ss 秒数</code>：开始时间点</li>
<li><code>-to HH:MM:SS</code>：结束时间点</li>
<li><code>-t HH:MM:SS</code>：持续时间</li>
<li><code>-c copy</code>：直接复制流，不重新编码，处理速度极快</li>
<li>如果不加 <code>-c copy</code>，FFmpeg 会重新编码，速度较慢但兼容性更好</li>
</ul>
<h2>3. 更精确的裁剪方法</h2>
<h3><strong>方法A：直接裁剪（快速）</strong></h3>
<pre><code class="language-bash"># 适合MP3文件，大部分情况下工作良好
ffmpeg -i input.mp3 -ss 00:01:00 -t 00:02:00 -acodec copy output.mp3</code></pre>
<h3><strong>方法B：重新编码裁剪（更精确）</strong></h3>
<pre><code class="language-bash"># 如果直接复制有问题，使用重新编码
ffmpeg -i input.mp3 -ss 00:01:00 -t 00:02:00 -c:a libmp3lame -q:a 2 output.mp3</code></pre>
<h2>4. 其他有用的裁剪场景</h2>
<h3><strong>裁剪开头部分</strong></h3>
<pre><code class="language-bash"># 去掉前15秒，保留剩下的部分
ffmpeg -i input.mp3 -ss 00:00:15 -c copy output.mp3</code></pre>
<h3><strong>裁剪结尾部分</strong></h3>
<pre><code class="language-bash"># 方法1：使用持续时间（比如只保留前2分钟）
ffmpeg -i input.mp3 -t 00:02:00 -c copy output.mp3

# 方法2：从结尾向前裁剪（需要知道总时长）
# 先查看文件信息：
ffmpeg -i input.mp3 2&gt;&amp;1 | grep Duration
# 假设总时长3:45，想要去掉最后45秒
ffmpeg -i input.mp3 -t 00:03:00 -c copy output.mp3</code></pre>
<h3><strong>批量裁剪多个文件</strong></h3>
<pre><code class="language-bash"># 使用循环批量处理
for file in *.mp3; do
    ffmpeg -i "$file" -ss 00:00:10 -t 00:01:00 -c copy "trimmed_${file}"
done

# 或者使用find命令
find . -name "*.mp3" -exec bash -c 'ffmpeg -i "$0" -ss 00:00:30 -t 00:02:00 -c copy "${0%.mp3}_trimmed.mp3"' {} \;</code></pre>
<h2>5. 使用 SoX（另一种选择）</h2>
<pre><code class="language-bash"># 安装 SoX（如果需要更多音频处理功能）
brew install sox

# 裁剪MP3（SoX需要libmad支持MP3，也可以先转WAV再处理）
sox input.mp3 output.mp3 trim 10 30  # 从10秒开始，裁剪30秒
# 或
sox input.mp3 output.mp3 trim 0:10 =0:40  # 从10秒到40秒</code></pre>
<h2>6. 实用技巧和示例</h2>
<h3><strong>查看MP3文件信息</strong></h3>
<pre><code class="language-bash"># 查看详细音视频信息
ffmpeg -i input.mp3

# 只查看时长
ffprobe -i input.mp3 -show_entries format=duration -v quiet -of csv="p=0"

# 查看格式和流信息
ffprobe -v error -show_format -show_streams input.mp3</code></pre>
<h3><strong>精确到毫秒的裁剪</strong></h3>
<pre><code class="language-bash">ffmpeg -i input.mp3 -ss 00:01:23.450 -t 00:00:45.678 -c copy output.mp3</code></pre>
<h3><strong>保持元数据</strong></h3>
<pre><code class="language-bash">ffmpeg -i input.mp3 -ss 00:00:30 -t 60 -c copy -map_metadata 0 output.mp3</code></pre>
<h3><strong>常见问题解决</strong></h3>
<p>如果遇到错误 &quot;Could not find codec parameters&quot;，尝试重新编码：</p>
<pre><code class="language-bash"># 方法1：使用libmp3lame编码器
ffmpeg -i input.mp3 -ss 00:01:00 -t 00:02:00 -acodec libmp3lame -ab 192k output.mp3

# 方法2：先转WAV再转MP3（最兼容）
ffmpeg -i input.mp3 -ss 00:01:00 -t 00:02:00 temp.wav
ffmpeg -i temp.wav -acodec libmp3lame -q:a 2 output.mp3
rm temp.wav</code></pre>
<h3><strong>一键裁剪脚本</strong></h3>
<p>创建一个 <code>trim_mp3.sh</code> 脚本：</p>
<pre><code class="language-bash">#!/bin/bash
# 用法：./trim_mp3.sh 输入文件.mp3 开始时间 结束时间 [输出文件.mp3]

INPUT="$1"
START="$2"
END="$3"
OUTPUT="${4:-${INPUT%.mp3}_trimmed.mp3}"

ffmpeg -i "$INPUT" -ss "$START" -to "$END" -c copy "$OUTPUT"

echo "裁剪完成：$INPUT → $OUTPUT"
echo "时间范围：$START - $END"</code></pre>
<p>给脚本执行权限并运行：</p>
<pre><code class="language-bash">chmod +x trim_mp3.sh
./trim_mp3.sh music.mp3 0:30 1:30 result.mp3</code></pre>
<h2>建议</h2>
<ol>
<li>
<p><strong>日常使用推荐命令</strong>：</p>
<pre><code class="language-bash"># 快速裁剪（最常用）
ffmpeg -i input.mp3 -ss 开始时间 -to 结束时间 -c copy output.mp3</code></pre>
</li>
<li>
<p><strong>时间格式灵活</strong>：</p>
<ul>
<li><code>HH:MM:SS</code> (01:23:45)</li>
<li><code>MM:SS</code> (83:45 即 1:23:45)</li>
<li>纯秒数 (5025)</li>
</ul>
</li>
<li>
<p><strong>验证结果</strong>：</p>
<pre><code class="language-bash"># 查看裁剪后的文件时长
ffprobe -i output.mp3 -show_entries format=duration -v quiet -of csv="p=0"</code></pre>
</li>
</ol>
<p>这些命令在 macOS 终端中都可以直接使用，FFmpeg 是处理音视频最强大的命令行工具。</p>]]></description>
    <pubDate>Fri, 12 Dec 2025 10:52:21 +0800</pubDate>
    <dc:creator>chunkuan</dc:creator>
    <guid>https://jiachunkuan.com/post-15.html</guid>
</item>
<item>
    <title>在 macOS 上使用 FFmpeg 将 MP4 视频中的音频提取并转换为 MP3 格式</title>
    <link>https://jiachunkuan.com/post-14.html</link>
    <description><![CDATA[<p>在 macOS 上使用 FFmpeg 将 MP4 视频中的音频提取并转换为 MP3 格式非常简单。以下是各种方法和详细说明：</p>
<h2>1. 基础命令（最常用）</h2>
<h3><strong>基本转换</strong></h3>
<pre><code class="language-bash"># 将MP4转换为MP3，使用默认质量
ffmpeg -i input_video.mp4 output_audio.mp3

# 指定输出比特率（如 192k）
ffmpeg -i input_video.mp4 -b:a 192k output_audio.mp3</code></pre>
<h3><strong>高质量转换</strong></h3>
<pre><code class="language-bash"># 使用 VBR（可变比特率）质量参数，范围0-9，0最高质量（文件最大）
ffmpeg -i input_video.mp4 -q:a 0 output_audio.mp3
# 或
ffmpeg -i input_video.mp4 -aq 0 output_audio.mp3

# 常用质量设置：
ffmpeg -i input_video.mp4 -q:a 2 output_audio.mp3  # 高质量（约190kbps）
ffmpeg -i input_video.mp4 -q:a 4 output_audio.mp3  # 中等质量（约130kbps）</code></pre>
<h2>2. 高级选项和参数详解</h2>
<h3><strong>控制音频流</strong></h3>
<pre><code class="language-bash"># 只提取音频流，忽略视频
ffmpeg -i input_video.mp4 -vn output_audio.mp3

# 提取特定的音频轨道（如果有多个）
ffmpeg -i input_video.mp4 -map 0:a:0 output_audio.mp3  # 第一个音频流
ffmpeg -i input_video.mp4 -map 0:a:1 output_audio.mp3  # 第二个音频流</code></pre>
<h3><strong>设置比特率</strong></h3>
<pre><code class="language-bash"># 恒定比特率（CBR）
ffmpeg -i input_video.mp4 -b:a 320k output_audio.mp3          # 320kbps（最高质量）
ffmpeg -i input_video.mp4 -b:a 256k output_audio.mp3          # 256kbps
ffmpeg -i input_video.mp4 -b:a 192k output_audio.mp3          # 192kbps（常用）
ffmpeg -i input_video.mp4 -b:a 128k output_audio.mp3          # 128kbps

# 可变比特率（VBR）预设
ffmpeg -i input_video.mp4 -c:a libmp3lame -q:a 0 output_audio.mp3    # 0-9，0最好</code></pre>
<h3><strong>控制采样率和声道</strong></h3>
<pre><code class="language-bash"># 设置采样率（如 44100Hz 或 48000Hz）
ffmpeg -i input_video.mp4 -ar 44100 output_audio.mp3

# 设置声道数
ffmpeg -i input_video.mp4 -ac 2 output_audio.mp3            # 立体声（默认）
ffmpeg -i input_video.mp4 -ac 1 output_audio.mp3            # 单声道</code></pre>
<h2>3. 完整示例命令</h2>
<pre><code class="language-bash"># 推荐的高质量转换命令
ffmpeg -i video.mp4 -vn -c:a libmp3lame -q:a 2 -ar 44100 -ac 2 output.mp3

# 参数解释：
# -i video.mp4        输入文件
# -vn                 不处理视频流
# -c:a libmp3lame     使用LAME MP3编码器
# -q:a 2              VBR质量等级2（高质量）
# -ar 44100          采样率44.1kHz（CD质量）
# -ac 2              立体声
# output.mp3         输出文件名</code></pre>
<h2>4. 批量处理多个文件</h2>
<h3><strong>使用循环</strong></h3>
<pre><code class="language-bash"># 批量转换当前目录下所有MP4文件
for file in *.mp4; do
    ffmpeg -i "$file" -vn -c:a libmp3lame -q:a 2 "${file%.mp4}.mp3"
done

# 批量转换并保持原文件名
find . -name "*.mp4" -exec bash -c 'ffmpeg -i "$0" -vn -c:a libmp3lame -q:a 2 "${0%.mp4}.mp3"' {} \;</code></pre>
<h3><strong>批量处理到指定目录</strong></h3>
<pre><code class="language-bash"># 创建输出目录
mkdir -p mp3_output

# 批量转换并保存到指定目录
for file in *.mp4; do
    ffmpeg -i "$file" -vn -c:a libmp3lame -q:a 2 "mp3_output/${file%.mp4}.mp3"
done</code></pre>
<h2>5. 保留元数据（ID3标签）</h2>
<pre><code class="language-bash"># 复制元数据
ffmpeg -i input_video.mp4 -vn -c:a libmp3lame -q:a 2 -map_metadata 0 output.mp3

# 添加自定义元数据
ffmpeg -i input_video.mp4 -vn -c:a libmp3lame -q:a 2 \
  -metadata title="歌曲标题" \
  -metadata artist="艺术家" \
  -metadata album="专辑名称" \
  -metadata year="2024" \
  output.mp3</code></pre>
<h2>6. 提取特定时间段的音频</h2>
<pre><code class="language-bash"># 从30秒到2分30秒
ffmpeg -i input_video.mp4 -ss 00:00:30 -to 00:02:30 -vn -c:a libmp3lame output.mp3

# 从1分钟开始，提取60秒
ffmpeg -i input_video.mp4 -ss 00:01:00 -t 00:01:00 -vn -c:a libmp3lame output.mp3</code></pre>
<h2>7. 特殊场景处理</h2>
<h3><strong>处理有多个音频轨道的视频</strong></h3>
<pre><code class="language-bash"># 列出所有流
ffmpeg -i input_video.mp4

# 提取第二个音频轨道（比如评论音轨）
ffmpeg -i input_video.mp4 -map 0:a:1 -c:a libmp3lame -q:a 2 comment_track.mp3</code></pre>
<h3><strong>从在线视频提取</strong></h3>
<pre><code class="language-bash"># 需要先下载视频，或者直接处理在线源（如果支持）
ffmpeg -i "https://example.com/video.mp4" -vn -c:a libmp3lame output.mp3</code></pre>
<h3><strong>处理非常大的文件</strong></h3>
<pre><code class="language-bash"># 使用快速提取模式（如果视频音频编码已经是MP3）
ffmpeg -i large_video.mp4 -vn -c:a copy output.mp3

# 但如果音频不是MP3格式，还是要转换：
ffmpeg -i large_video.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3</code></pre>
<h2>8. 创建便捷脚本</h2>
<h3><strong>创建转换脚本 <code>video2mp3.sh</code></strong></h3>
<pre><code class="language-bash">#!/bin/bash
# 用法：./video2mp3.sh 输入文件.mp4 [输出文件.mp3] [质量0-9]

INPUT="$1"
OUTPUT="${2:-${INPUT%.mp4}.mp3}"
QUALITY="${3:-2}"

echo "正在转换: $INPUT → $OUTPUT"
echo "质量等级: $QUALITY (0=最高, 9=最低)"

ffmpeg -i "$INPUT" -vn -c:a libmp3lame -q:a "$QUALITY" -ar 44100 -ac 2 "$OUTPUT"

if [ $? -eq 0 ]; then
    echo "✓ 转换成功: $OUTPUT"

    # 显示文件信息
    filesize=$(du -h "$OUTPUT" | cut -f1)
    duration=$(ffprobe -i "$OUTPUT" -show_entries format=duration -v quiet -of csv="p=0")
    duration_fmt=$(printf "%02d:%02d" $((duration/60)) $((duration%60)))

    echo "文件大小: $filesize"
    echo "音频时长: $duration_fmt"
else
    echo "✗ 转换失败"
    exit 1
fi</code></pre>
<h3><strong>给脚本执行权限并使用</strong></h3>
<pre><code class="language-bash">chmod +x video2mp3.sh

# 基本用法
./video2mp3.sh myvideo.mp4

# 指定输出文件名
./video2mp3.sh myvideo.mp4 output.mp3

# 指定质量（0最高质量，9最低质量）
./video2mp3.sh myvideo.mp4 output.mp3 0</code></pre>
<h2>9. 推荐的命令组合</h2>
<p><strong>对于大多数情况，使用这个命令就够了：</strong></p>
<pre><code class="language-bash">ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 -ar 44100 -ac 2 output.mp3</code></pre>
<p><strong>如果想快速提取且不关心压缩质量（文件会稍大）：</strong></p>
<pre><code class="language-bash">ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 0 output.mp3</code></pre>
<p><strong>如果想得到最小文件（质量较低）：</strong></p>
<pre><code class="language-bash">ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 9 -ar 22050 -ac 1 output.mp3</code></pre>
<h2>10. 查看转换进度和验证</h2>
<pre><code class="language-bash"># 显示详细进度
ffmpeg -i input.mp4 -vn -c:a libmp3lame output.mp3 -progress /dev/stdout

# 转换完成后验证
ffprobe output.mp3 2&gt;&amp;1 | grep -E "Duration|Audio|bitrate"

# 快速检查
file output.mp3
mp3info output.mp3  # 如果安装了mp3info</code></pre>
<h2>安装提示</h2>
<p>如果还没有安装 FFmpeg：</p>
<pre><code class="language-bash"># 使用 Homebrew 安装
brew install ffmpeg

# 验证安装
ffmpeg -version</code></pre>
<p>这个工具非常强大，一次安装后就可以处理几乎所有的音视频转换需求。</p>]]></description>
    <pubDate>Fri, 12 Dec 2025 10:49:14 +0800</pubDate>
    <dc:creator>chunkuan</dc:creator>
    <guid>https://jiachunkuan.com/post-14.html</guid>
</item>
<item>
    <title>用命令来修改目录及其内容的所属用户和组</title>
    <link>https://jiachunkuan.com/post-13.html</link>
    <description><![CDATA[<h2>命令</h2>
<pre><code class="language-bash">chown -R www:www ./data</code></pre>
<ul>
<li><strong>chown</strong>: change owner（修改所有者）命令</li>
<li><strong>-R</strong>: 递归参数，对目录及其所有子目录和文件生效</li>
<li><strong>www:www</strong>: 用户名:组名，表示将所有者设为www用户，所属组设为www组</li>
<li><strong>data</strong>: 目标目录名</li>
</ul>
<h2>常见应用场景</h2>
<h3>1. Web服务器权限设置</h3>
<pre><code class="language-bash"># 为网站目录设置权限
chown -R www:www /var/www/html
chmod -R 755 /var/www/html</code></pre>
<h3>2. 特定应用目录</h3>
<pre><code class="language-bash"># 为应用缓存、上传目录设置权限
chown -R www:www uploads/
chown -R www:www cache/</code></pre>
<h3>3. 完整的Web目录权限设置流程</h3>
<pre><code class="language-bash"># 1. 修改所有者
chown -R www:www /path/to/website

# 2. 设置目录权限为755
find /path/to/website -type d -exec chmod 755 {} \;

# 3. 设置文件权限为644
find /path/to/website -type f -exec chmod 644 {} \;

# 4. 对可写目录设置特殊权限
chmod 777 /path/to/website/uploads</code></pre>
<h2>注意事项</h2>
<ol>
<li><strong>安全性</strong>: 确保只有必要的目录才给www用户写权限</li>
<li><strong>备份</strong>: 修改权限前建议先备份重要数据</li>
<li><strong>验证</strong>: 修改后检查权限是否正确
<pre><code class="language-bash">ls -la data/</code></pre></li>
</ol>
<p>这个命令通常用于配置Web服务器（如Nginx、Apache）时，确保Web服务进程有适当的文件访问权限。</p>]]></description>
    <pubDate>Mon, 20 Oct 2025 11:47:06 +0800</pubDate>
    <dc:creator>chunkuan</dc:creator>
    <guid>https://jiachunkuan.com/post-13.html</guid>
</item>
<item>
    <title>解决SSL证书验证问题的方法(cURL error 60: SSL certificate problem: unable to get local issuer certificate)</title>
    <link>https://jiachunkuan.com/post-12.html</link>
    <description><![CDATA[<pre><code class="language-php">$url = 'https://www.xxx.com/aaa.htm';
        echo (Http::get($url)-&gt;body());
</code></pre>
<p>报错：</p>
<pre><code class="language-shell">GuzzleHttp\Exception\RequestException
cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://gjhz.sxpi.edu.cn/lhlx.htm</code></pre>
<p>这个错误是因为 cURL 无法验证目标网站的 SSL 证书，因为缺少本地颁发机构证书（CA 证书）。这是一个常见的安全验证问题。</p>
<p>有几种解决方法：</p>
<h3>方法 1：禁用 SSL 验证（不推荐用于生产环境）</h3>
<pre><code class="language-php">$url = 'https://www.xxx.com/aaa.htm';
echo Http::withOptions(['verify' =&gt; false])-&gt;get($url)-&gt;body();</code></pre>
<h3>方法 2：指定正确的 CA 证书路径（推荐）</h3>
<ol>
<li>下载最新的 CA 证书包，例如从 <a href="https://curl.se/docs/caextract.html">https://curl.se/docs/caextract.html</a> 下载 <code>cacert.pem</code></li>
<li>将其保存到你的项目目录中</li>
<li>在代码中指定证书路径：</li>
</ol>
<pre><code class="language-php">$url = 'https://www.xxx.com/aaa.htm';
echo Http::withOptions(['verify' =&gt; '/path/to/cacert.pem'])-&gt;get($url)-&gt;body();</code></pre>
<h3>方法 3：更新系统的 CA 证书</h3>
<p>如果你有服务器管理权限，可以更新系统的 CA 证书：</p>
<ul>
<li>在 Ubuntu/Debian 上：<code>sudo apt-get install --reinstall ca-certificates</code></li>
<li>在 CentOS/RHEL 上：<code>sudo yum reinstall ca-certificates</code></li>
</ul>
<h3>方法 4：如果是 Laravel 的 HTTP 客户端</h3>
<p>Laravel 8+ 的 HTTP 客户端默认使用 Guzzle，你可以这样配置：</p>
<pre><code class="language-php">$url = 'https://www.xxx.com/aaa.htm';
echo Http::withOptions([
    'verify' =&gt; true, // 或指定证书路径
])-&gt;get($url)-&gt;body();</code></pre>
<p>建议使用方法 2，因为它保持了安全性。只在开发和测试环境中使用方法 1。</p>]]></description>
    <pubDate>Thu, 07 Aug 2025 10:19:35 +0800</pubDate>
    <dc:creator>chunkuan</dc:creator>
    <guid>https://jiachunkuan.com/post-12.html</guid>
</item>
<item>
    <title>windows 设置开机自启的方法</title>
    <link>https://jiachunkuan.com/post-11.html</link>
    <description><![CDATA[<p>在 Windows 系统中，你可以通过多种方式设置程序的开机自启动。以下是几种常见的方法：</p>
<hr />
<h3><strong>方法 1：通过“启动”文件夹设置</strong></h3>
<ol>
<li>
<p><strong>打开启动文件夹</strong>：</p>
<ul>
<li>按下 <code>Win + R</code>，输入 <code>shell:startup</code>，然后按回车。</li>
<li>或者手动导航到：
<pre><code class="language-shell">C:\Users\&lt;你的用户名&gt;\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup</code></pre>
<p>（<code>&lt;你的用户名&gt;</code> 替换为你的实际用户名）</p></li>
</ul>
</li>
<li>
<p><strong>添加快捷方式</strong>：</p>
<ul>
<li>将需要开机启动的程序的快捷方式复制到这个文件夹。</li>
<li>如果没有快捷方式，可以右键程序文件 → <strong>发送到</strong> → <strong>桌面快捷方式</strong>，再将快捷方式拖到启动文件夹。</li>
</ul>
</li>
</ol>
<hr />
<h3><strong>方法 2：通过任务计划程序设置</strong></h3>
<ol>
<li>按下 <code>Win + R</code>，输入 <code>taskschd.msc</code>，回车打开 <strong>任务计划程序</strong>。</li>
<li>右侧点击 <strong>创建任务</strong>：
<ul>
<li><strong>常规</strong>选项卡：
<ul>
<li>输入名称（如“MyApp开机启动”）。</li>
<li>勾选 <strong>“不管用户是否登录都要运行”</strong>（可选，需管理员权限）。</li>
</ul></li>
<li><strong>触发器</strong>选项卡：
<ul>
<li>点击 <strong>新建</strong> → 选择 <strong>“登录时”</strong>（或“启动时”）。</li>
</ul></li>
<li><strong>操作</strong>选项卡：
<ul>
<li>点击 <strong>新建</strong> → 选择 <strong>“启动程序”</strong> → 浏览选择你的程序路径。</li>
</ul></li>
</ul></li>
<li>点击 <strong>确定</strong> 保存。</li>
</ol>
<blockquote>
<p><strong>适用场景</strong>：需要更灵活的控制（如延迟启动、管理员权限等）。</p>
</blockquote>
<hr />
<h3><strong>方法 3：通过注册表设置</strong></h3>
<ol>
<li>按下 <code>Win + R</code>，输入 <code>regedit</code>，回车打开注册表编辑器。</li>
<li>导航到以下路径：
<pre><code class="language-shell">HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run</code></pre>
<p>（当前用户生效）<br />
或  </p>
<pre><code class="language-shell">HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run</code></pre>
<p>（所有用户生效，需管理员权限）。</p></li>
<li>右键右侧空白处 → <strong>新建</strong> → <strong>字符串值</strong>，命名为程序名称。</li>
<li>双击新建的字符串，在“数值数据”中输入程序的完整路径（如 <code>C:\Program Files\MyApp\app.exe</code>）。</li>
<li>点击 <strong>确定</strong> 并关闭注册表。</li>
</ol>
<blockquote>
<p><strong>注意</strong>：修改注册表有风险，建议先备份。</p>
</blockquote>
<hr />
<h3><strong>方法 4：通过系统配置（msconfig）</strong></h3>
<ol>
<li>按下 <code>Win + R</code>，输入 <code>msconfig</code>，回车。</li>
<li>切换到 <strong>启动</strong> 选项卡（Windows 10 及以后版本需通过任务管理器设置）。</li>
<li>在任务管理器的 <strong>启动</strong> 选项卡中，找到你的程序，右键启用。</li>
</ol>
<blockquote>
<p><strong>注意</strong>：适用于传统程序，现代应用可能不显示在这里。</p>
</blockquote>
<hr />
<h3><strong>方法 5：通过软件自带设置</strong></h3>
<p>许多软件（如微信、Steam等）在设置中提供 <strong>“开机自启动”</strong> 选项，直接勾选即可。</p>
<hr />
<h3><strong>注意事项</strong></h3>
<ol>
<li><strong>权限问题</strong>：部分程序需要管理员权限才能开机启动，需在快捷方式或任务计划中设置。</li>
<li><strong>性能影响</strong>：过多启动项会拖慢开机速度，建议仅启用必要程序。</li>
<li><strong>病毒风险</strong>：恶意软件常利用自启动，如果发现可疑项，请及时排查。</li>
</ol>
<p>根据需求选择合适的方法即可！</p>]]></description>
    <pubDate>Thu, 07 Aug 2025 10:04:03 +0800</pubDate>
    <dc:creator>chunkuan</dc:creator>
    <guid>https://jiachunkuan.com/post-11.html</guid>
</item>
<item>
    <title>给元素添加透明样式（方块块）</title>
    <link>https://jiachunkuan.com/post-10.html</link>
    <description><![CDATA[<p><img src="https://jiachunkuan.com/content/uploadfile/202506/2bf41750385820.png" alt="" /></p>
<pre><code class="language-css">.div-name {
    background-image: linear-gradient(45deg, #f4f4f5 25%, #f000 25%), linear-gradient(135deg, #f4f4f5 25%, #0000 25%), linear-gradient(45deg, #0000 75%, #f4f4f5 75%), linear-gradient(135deg, #0000 75%, #f4f4f5 75%);
    background-size: 20px 20px;
    background-position: 0px 0px, 10px 0px, 10px -10px, 0px 10px;
}</code></pre>]]></description>
    <pubDate>Fri, 20 Jun 2025 10:15:52 +0800</pubDate>
    <dc:creator>chunkuan</dc:creator>
    <guid>https://jiachunkuan.com/post-10.html</guid>
</item>
<item>
    <title>DcatAdmin 配置富文本，TinyEditor 上传文件，上传视频</title>
    <link>https://jiachunkuan.com/post-9.html</link>
    <description><![CDATA[<pre><code class="language-php">Editor::resolving(function (Editor $editor) {
    $editor-&gt;options(
        [
            'file_picker_callback' =&gt; \Dcat\Admin\Support\JavaScript::make(&lt;&lt;&lt;JS
                function (callback, value, meta) {
                    // 设置上传地址为原富文本框图片文件上传地址
                    var upurl = opts.images_upload_url;
                    var filetype = '';
                    // 处理媒体类型文件能选择的文件类型
                    if (meta.filetype == 'media') {
                        filetype = '.mp4,.webm,.ogg'
                    }
                    var input = document.createElement('input');
                    input.setAttribute('type', 'file');
                    input.setAttribute('accept', filetype);
                    input.click();
                    input.onchange = function() {
                        // 文件选择后进行上传
                        var file = this.files[0];
                        var xhr, formData;
                        console.log(file.name);
                        xhr = new XMLHttpRequest();
                        xhr.withCredentials = false;
                        xhr.open('POST', upurl);
                        xhr.onload = function() {
                            var json;
                            if (xhr.status != 200) {
                                failure('HTTP Error: ' + xhr.status);
                                return;
                            }
                            json = JSON.parse(xhr.responseText);
                            if (!json || typeof json.location != 'string') {
                                failure('Invalid JSON: ' + xhr.responseText);
                                return;
                            }
                            callback(json.location, {
                                title: file.name,
                                text: file.name
                            });
                        };
                        formData = new FormData();
                        formData.append('file', file, file.name );
                        xhr.send(formData);
                    }
                }
            JS),
        ]
    );
});</code></pre>]]></description>
    <pubDate>Thu, 01 May 2025 16:53:27 +0800</pubDate>
    <dc:creator>chunkuan</dc:creator>
    <guid>https://jiachunkuan.com/post-9.html</guid>
</item>
<item>
    <title>DcatAdmin  配置富文本，让工具条固定到顶部</title>
    <link>https://jiachunkuan.com/post-8.html</link>
    <description><![CDATA[<p>在项目app/Admin/bootstrap.php中进行设置：</p>
<pre><code class="language-php">Editor::resolving(function (Editor $editor) {
    $editor-&gt;options(
        [
            'toolbar_sticky' =&gt; true,
            'toolbar_sticky_offset' =&gt; 60,
        ]
    );
});</code></pre>]]></description>
    <pubDate>Thu, 01 May 2025 16:47:18 +0800</pubDate>
    <dc:creator>chunkuan</dc:creator>
    <guid>https://jiachunkuan.com/post-8.html</guid>
</item>
</channel>
</rss>