Windows 10环境下如何用FFmpeg以直播流运行时长作为文件名戳保存分段剪辑
Windows 10环境下如何用FFmpeg以直播流运行时长作为文件名戳保存分段剪辑
嘿,这个需求我刚好折腾过!在Windows 10上用FFmpeg实现按直播流的运行时长来命名分段文件,完全可以做到,不过需要稍微调整一下命令逻辑,我给你详细说说~
首先,你原来的命令用了-strftime 1,这是调用系统当前时间来命名,而我们需要的是相对于直播流自身起始时间的时长,所以得换个思路:先拿到流的起始时间戳,再用FFmpeg的表达式计算每个分段相对于流开始的时长,最后把这个时长格式成你要的小时-分钟-秒文件名。
具体实现步骤
我推荐用Windows批处理来完成,这样逻辑更清晰,操作也方便:
先获取直播流的起始时间戳
用ffprobe(FFmpeg自带的工具)提取流的起始时间,这个时间是流本身开播的时间,不是你开始录制的时间。用FFmpeg录制并按流时长命名分段
把获取到的流起始时间作为偏移量,在FFmpeg命令中计算每个分段的相对时长,再格式成文件名。
完整的批处理脚本
把下面的内容保存成record_stream.bat(记得把livestreamURL.m3u8换成你的实际直播流地址):
@echo off :: 获取直播流的起始时间戳(浮点数格式) for /f "delims=" %%a in ('ffprobe -v error -show_entries format=start_time -of default=noprint_wrappers=1:nokey=1 livestreamURL.m3u8') do set "stream_start=%%a" :: 启动FFmpeg录制,按流运行时长命名分段 ffmpeg -i livestreamURL.m3u8 -c copy -f segment -segment_time 01:00:00 -segment_time_metadata 1 ^ -segment_filename "source_%{eif:(metadata:segment_start_time-%stream_start%)/3600,floor,d}-%{eif:((metadata:segment_start_time-%stream_start%)%%3600)/60,floor,d:%02d}-%{eif:(metadata:segment_start_time-%stream_start%)%%60,floor,d:%02d}.mp4"
关键参数解释
-segment_time_metadata 1:让FFmpeg为每个分段生成包含该段起始时间戳的元数据,后续用来计算相对时长-segment_filename里的表达式:%{eif:(metadata:segment_start_time-%stream_start%)/3600,floor,d}:把相对总秒数除以3600,取整得到小时数%{eif:((metadata:segment_start_time-%stream_start%)%%3600)/60,floor,d:%02d}:把总秒数取模3600后除以60,取整并补零得到分钟数%{eif:(metadata:segment_start_time-%stream_start%)%%60,floor,d:%02d}:把总秒数取模60,取整并补零得到秒数
^是Windows批处理的换行符,只是为了让命令更易读,实际运行不影响效果
注意事项
- 确保FFmpeg和ffprobe已经添加到Windows的系统PATH中,要是没加的话,就把命令里的
ffprobe和ffmpeg换成它们的完整路径(比如C:\Program Files\ffmpeg\bin\ffprobe.exe) - 测试的时候可以把
-segment_time改成短一点的时间(比如00:00:10),这样能快速验证文件名是否符合预期 - 如果是刚开播的流,起始时间接近0,第一个分段的文件名会是
source_0-00-00.mp4,完全符合逻辑
备注:内容来源于stack exchange,提问作者zerp
相关产品推荐
相关产品推荐

