最近我正在为一个项目使用 FFmpeg。我使用 FFmpeg 转换 mp3 比特率和其他内容。这些都运行良好。但现在我想为m3u8 文件中的mp3%2Fmusic%2F[outputN.ts]?alt=media
每个文本添加。这是我的 m3u8 文件数据结构,outputN.ts
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:2.005333,
'output000.ts'
#EXTINF:2.005333,
'output001.ts'
例如,现在我想使用 Windows cmd 将mp3%2Fmusic%2F
和?alt=media
应用于此 m3u8 文件中的每个文本(output000.ts
,output001.ts
等等)。
例如
#EXTINF:2.005333,
mp3%2Fmusic%2Foutput000.ts?alt=media
#EXTINF:2.005333,
mp3%2Fmusic%2Foutput001.ts?alt=media
答案1
@echo off
cd /d "D:\Folder\Where\Your\files\m3u8\are" && setlocal enabledelayedexpansion
>tmp.m3u8 (for /f tokens^=*eol^= %%# in (file.m3u8)do echo\%%~#|findstr /e [0-9]\.ts'>nul && (
set "_out=%%~#" && cmd.exe /v /s /c "echo\mp3%%2Fmusic%%2F!_out:'=!?alt=media") || echo\%%~# )
>nul move /y tmp.m3u8 file.m3u8 & endlocal
1.使用 afor /f
来逐行获取文件中的列表:
for /f tokens^=*eol^= %%# in (file.m3u8)do ...
2.您可以使用echo\
当前行(%%~#
),并使用findstr /e
正则表达式直接转到查找以结尾的过滤行[numbers].ts'
echo\%%#|findstr /e .[0-9]\.ts' >nul
3.使用&&
与||
操作符(等于return 0
/ return non 0
),当在当前循环的行中找到字符串findstr
(&&
)时,则进行替换,如果没有,则保持同一行不变。
echo\%%~#|findstr /e [0-9]\.ts'>nul && (do ...) || do ...
观察:当当前行包含字符串时'output000.ts'
,我们将删除'
从字符串中定义行并使用变量substring:'=nothing!
已经与所需的最终字符串/行连接起来!_out:'=!
set "_out=%%~#" && cmd.exe /v /s /c "echo\mp3%%2Fmusic%%2F!_out:'=!?alt=media"
4.我们将使用一个临时文件保存循环的所有操作>tmp.file (loop actions)
,完成后,我们将使用 move 命令用与循环中使用的文件相同的名称覆盖这个临时文件:
>tmp.m3u8 (for /f ... )
>nul move /y tmp.m3u8 file.m3u8 ...