使用ytdl-core+ffmpeg-static生成的视频时长异常过长问题
解决Windows 10播放器无法识别ytdl+ffmpeg合成视频时长的问题
问题根源
你当前FFmpeg参数里的empty_moov是导致异常的核心原因:这个参数会生成不带moov原子的碎片化MP4,Windows 10自带播放器必须依赖这个原子读取视频时长、进度等元数据,而VLC、Discord这类播放器能动态解析流式内容,所以不受影响。
具体修改方案
替换FFmpeg的-movflags参数,移除empty_moov,改用faststart,同时保留frag_keyframe支持流式传输:
'-movflags', 'frag_keyframe+faststart',
faststart会将moov原子移到文件头部,这样播放器在下载/播放初期就能获取到正确的元数据,既不影响流式传输,又能让Windows播放器正确识别时长并支持进度拖动。
额外优化建议
- 你代码里重复写了
-vcodec和-c:v,两者作用完全一致,保留一个即可(比如保留-c:v libx264) - 如果是服务端处理大量请求,建议把
-preset veryslow换成medium,平衡压缩速度和文件体积;如果追求极致压缩率,可以保留原设置
修改后的FFmpeg参数片段
const ffmpegProcess = cp.spawn(ffmpeg, [ '-i', `pipe:3`, '-i', `pipe:4`, '-map', '1:0', '-map', '0:0', '-c:v', 'libx264', '-c:a', 'aac', '-crf', '27', '-preset', 'veryslow', '-b:v', '1500k', '-b:a', '128k', '-movflags', 'frag_keyframe+faststart', '-f', 'mp4', '-loglevel', 'error', '-', ], { stdio: [ 'pipe', 'pipe', 'pipe', 'pipe', 'pipe', ], });
内容的提问来源于stack exchange,提问作者daraem
相关产品推荐
相关产品推荐

