如何更改 m3u8 文件中的 .ts 文件名

如何更改 m3u8 文件中的 .ts 文件名

最近我正在为一个项目使用 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.tsoutput001.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 ...

相关内容