Mac替换ccextractor为ffmpeg后字幕提取的换行与标签问题求助
问题与解决方案
问题描述
- 原基于
ccextractor的字幕提取脚本失效,切换至ffmpeg提取视频字幕,目标是生成无换行的单段纯文本字幕 - 遇到两个核心问题:
- 原
awk命令无法有效去除换行,输出仍存在大量换行 - 部分文件提取的字幕包含HTML格式标签(如
<font face="Serif" size="18">Example line</font>)
- 原
用户原代码片段:
ffmpeg -i "$filename" "${filename}.srt" # If the file has subtitles, extract them if [ "$has_subtitles" ]; then ccextractor "$filename" -o "${filename}.srt" # Use dos2unix to convert the file to the correct format dos2unix "${filename}.srt" # Remove the timestamps from the .srt file awk -v RS= '{ for (i=5;i<=NF;i++){ printf "%s%s", (sep ? " " : ""), $i sep=1 } } END{ print "" }' "${filename}.srt" | pbcopy rm "${filename}.srt" fi
用户后续修改尝试(仅去除标签,换行问题未解决):
END{ print "" }' "${filename}.srt" | sed 's/<[^>]*>//g' | tr '\n' ' ' | pbcopy
修正后的脚本
#!/bin/bash filename="$1" # 检查目标文件是否存在 if [ ! -f "$filename" ]; then echo "文件不存在" exit 1 fi # 用ffmpeg提取第一条字幕轨,覆盖已有文件并屏蔽冗余日志 ffmpeg -i "$filename" -map 0:s:0 "${filename}.srt" -y 2>/dev/null # 检查字幕文件是否生成成功 if [ -f "${filename}.srt" ]; then # 转换文件格式为Unix换行 dos2unix "${filename}.srt" 2>/dev/null # 一站式处理字幕:过滤无效行、移除HTML标签、合并为单段无换行文本 awk ' # 跳过序号行、时间线行、空行 /^[0-9]+$/ || /^-->/ || /^$/ { next } { # 移除所有HTML标签 gsub(/<[^>]+>/, "") # 将当前行内容用空格连接 printf "%s ", $0 } END { # 移除末尾多余空格并输出换行 printf "\n" }' "${filename}.srt" | sed 's/ */ /g' | tr -d '\n' | pbcopy # 清理临时字幕文件 rm "${filename}.srt" else echo "未检测到字幕或提取失败" fi
关键修改说明
- 替换提取工具:彻底用
ffmpeg替代失效的ccextractor,通过-map 0:s:0精准提取第一条字幕轨,避免无效操作 - 精准过滤无效内容:用
awk直接跳过srt文件中的序号、时间线和空行,只处理纯字幕文本 - 一站式处理标签与换行:在
awk中直接移除HTML标签,同时将每行字幕用空格连接,避免后续换行混乱 - 优化文本格式:用
sed合并连续空格,tr -d '\n'彻底清除所有换行符,最终生成标准单段文本并复制到剪贴板 - 增加容错机制:添加文件存在性检查、字幕生成结果检查,避免无意义的执行流程
内容的提问来源于stack exchange,提问作者Fab dub
相关产品推荐
相关产品推荐

