Board logo

标题: [数值计算] 请问 BAT 如何获取mp4文件的帧数和帧率并赋值给变量? [打印本页]

作者: egg6600    时间: 2021-9-1 22:15     标题: 请问 BAT 如何获取mp4文件的帧数和帧率并赋值给变量?

如果 ffmpeg.exe 所在目录为 D:\ffmpeg,ffprobe.exe 也在相同目录下(如果有需要用到的话)
视频为 D:\Video\1.mp4,为短视频,一般在30s以内

我想用 bat 获取 1.mp4 文件的帧数(如654),并赋值给变量 a
获取放大千倍后的帧率并赋值给变量 b,如帧率为 23.976则赋值给 b=23976,如果帧率是 30 的话那 b=30000
请问如何实现?
作者: Batcher    时间: 2021-9-1 22:45

回复 1# egg6600


看看这个命令的结果里面有没有你需要的【帧数】
ffmpeg -i "1.mp4"

如果有,参照这个代码把它赋值给变量:
http://bbs.bathome.net/thread-54211-1-1.html#pid224827
作者: egg6600    时间: 2021-9-1 23:48

回复 2# Batcher


    谢谢,帧率有了,但帧数没有,不过有个时长,理论上可以用 帧数=时长x帧率 算出,可是时长的精度不够,没精确到毫秒,算出来的帧数不大对,最好是能直接获取帧数
作者: Batcher    时间: 2021-9-2 12:03

回复 3# egg6600
  1. ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets -of csv=p=0 1.mp4
复制代码
  1. mediainfo --Output="Video;%FrameCount%" 1.mp4
复制代码
  1. ffmpeg -i 1.mp4 -map 0:v:0 -c copy -f null - 2>&1 | findstr "^frame="
复制代码
  1. @echo off
  2. for /f "tokens=2" %%i in ('ffmpeg -i 1.mp4 -map 0:v:0 -c copy -f null - 2^>^&1 ^| findstr /b "frame="') do (
  3.     set "FrameCount=%%i"
  4. )
  5. echo %FrameCount%
  6. pause
复制代码

作者: egg6600    时间: 2021-9-2 15:22

回复 4# Batcher

一、帧率
用 ffmpeg 出来的帧率也不准确,比如 fps=23.976,它只保留了小数点后2位

二、帧数
1、第一条命令可以输出帧数,但怎么赋值给变量 a 呢?
2、第2条命令,我去下了 https://mediaarea.net/en/MediaInfo,可是没执行成功。
3、第3条命令,我执行了之后输出了一整行信息,同样不知道如何赋值给 a
4、第4条命令,可以,也看到时赋值给变量 FrameCount 了,可是帧率呢?就像我上面第一点说的,不精确,咋办?

结论:是不是用 ffmpeg 出来的都不精确(帧率),用别的比如 ffmpeg 是不是会好一点,但不知道 ffprobe 得到的结果怎么赋值给变量 a、b,因为我还要这2个参与后续的批处理。得到的变量b(帧率)最好是放大千倍后的,比如 23976 这样子。
作者: Batcher    时间: 2021-9-2 15:33

回复 5# egg6600
  1. @echo off
  2. for /f %%i in ('ffprobe -v error -select_streams v:0 -count_packets -show_entries stream^=nb_read_packets -of csv^=p^=0 1.mp4') do (
  3.     set "FrameCount=%%i"
  4. )
  5. echo %FrameCount%
  6. pause
复制代码

作者: Batcher    时间: 2021-9-2 15:53

回复 5# egg6600


我下载的是 https://mediaarea.net/download/b ... .03_Windows_x64.zip
解压缩之后把 MediaInfo.exe 和 LIBCURL.DLL 这两个文件跟test.bat脚本以及1.mp4文件放在同一个目录下
  1. @echo off
  2. for /f %%i in ('mediainfo --Output^="Video;%%FrameCount%%" 1.mp4') do (
  3.     set "Frame_Count=%%i"
  4. )
  5. echo %Frame_Count%
  6. pause
复制代码

作者: egg6600    时间: 2021-9-2 19:34

回复 6# Batcher


    谢谢,用这个可以将帧数赋值出来给变量。那帧率呢?

我参考了再网上找的一段代码:
  1. ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate file.mp4
复制代码
直接运行可得到帧率: 24000/1001

但是不知道怎么赋值出来,我参考上面你写的,然后我套进去,结果出错
  1. @echo off
  2. for /f %%i in ('ffprobe -v error -select_streams v:0 -count_packets -show_entries stream^=nb_read_packets -of csv^=p^=0 1.mp4') do (
  3.     set "FrameCount=%%i"
  4. )
  5. echo %FrameCount%
  6. for /f %%j in ('ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate 1.mp4') do (
  7.     set "b=%%j"
  8. )
  9. echo %b%
  10. pause
复制代码
不知道哪里出问题
作者: egg6600    时间: 2021-9-2 20:39

算了,不获取帧率,我试了一下,对于一些非常规的帧率,获取得不是很正确
还是获取时长吧,要准确一点的 , ffmpeg 还是不够精确,ffprobe 就可以,下面是代码
  1. ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
复制代码
可是怎么赋值给变量 c 呢?
作者: Batcher    时间: 2021-9-2 21:56

回复 9# egg6600
  1. @echo off
  2. for /f %%i in ('ffprobe -v error -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 1.mp4') do (
  3.     set "c=%%i"
  4. )
  5. echo %c%
  6. pause
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2