如何使用FFmpeg获取视频流FPS及转码时写入清单的相关问题
如何使用FFmpeg获取视频流FPS及转码时写入清单的相关问题
从你贴的代码console.log(this.dsh.getBitrateInfoListFor('video'))和截图来看,你现在尝试用dashjs获取视频流的比特率信息,但没找到帧率(FPS)相关字段对吧?我来一步步帮你解决这个问题:
一、先查看现有视频流的FPS
如果你只是想确认源视频或已转码视频的帧率,可以用FFmpeg的配套工具ffprobe来快速获取:
- 查看详细的视频流信息(包含帧率):
输出里找到ffprobe -i input.mp4Stream #0:0(视频流)那一行,会有类似30 fps, 30 tbr, 1k tbn, 60 tbc的内容,这里的30 fps就是视频帧率。 - 直接输出帧率数值,更简洁:
这个命令会直接返回类似ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 input.mp430/1的结果,代表30帧每秒。
二、转码时将FPS写入DASH清单(MPD)
你猜的没错——要让dashjs能通过getBitrateInfoListFor拿到FPS,必须在转码生成DASH清单(MPD文件)时,让FFmpeg把帧率元数据写入到清单里。
基础FFmpeg转码生成DASH的命令
下面是一个标准的转码命令,会自动把源视频的帧率信息写入到MPD中:
ffmpeg -i input.mp4 \ -c:v libx264 -crf 23 -preset medium \ -c:a aac -b:a 128k \ -f dash -use_timeline 1 -use_template 1 \ output.mpd
关键参数说明:
-f dash:指定输出格式为DASH标准-use_timeline 1和-use_template 1:生成符合规范的DASH清单结构,确保元数据被正确包含
强制指定固定帧率(可选)
如果你的源视频帧率不稳定,或者想要强制设置一个固定帧率,可以加上-r参数,同时显式添加帧率元数据:
ffmpeg -i input.mp4 \ -r 30 \ -c:v libx264 -crf 23 -preset medium \ -c:a aac -b:a 128k \ -f dash -use_timeline 1 -use_template 1 \ -metadata:s:v:0 fps=30 \ output.mpd
这里的-metadata:s:v:0 fps=30是显式给视频流添加帧率元数据,进一步确保MPD里会包含这个信息。
三、用dashjs获取FPS信息
当MPD里正确包含帧率信息后,你再调用this.dsh.getBitrateInfoListFor('video'),返回的每个比特率信息对象里应该会有frameRate属性,示例代码:
const bitrateInfoList = this.dsh.getBitrateInfoListFor('video'); bitrateInfoList.forEach(info => { console.log(`分辨率: ${info.width}x${info.height}, 帧率: ${info.frameRate}`); });
这样就能轻松拿到每个视频流的FPS啦!
备注:内容来源于stack exchange,提问作者Дмитрий
相关产品推荐
相关产品推荐

