【问题标题】:Retrieve video file duration (time) using R使用 R 检索视频文件持续时间(时间)
【发布时间】:2013-11-22 11:57:19
【问题描述】:

我正在创建一个代码来删除一些我不需要的视频文件。这些视频来自闭路电视录像,24/7 全天候录制。但是,录制视频的软件会将文件保存在大约 1 小时的视频中,这就是问题所在(不是确切的持续时间)。我只对保留一天中特定时段的视频(会有所不同)感兴趣,并且由于视频的持续时间不准确,这给我带来了问题。

视频文件名有日期和时间戳,但仅用于开始,所以如果我能找到持续时间,一切都会变得简单。

所以我的问题很简单,是否可以使用 R 获取视频文件的持续时间(时间)?

视频来自多个摄像头,每个摄像头都具有不同的录制帧速率,因此还有其他一些有用信息,因此无法使用 file.info 返回文件大小并得出视频长度。视频文件也是 .avi 格式。

干杯 帕特劳

【问题讨论】:

  • 您可以编写一个 VirtualDub 脚本并在每个文件上运行它吗?
  • 如果你在linux上,试试askubuntu.com/questions/303454/…
  • @Roman 不幸的是,我无法编写 VirtualDub 代码,而且我使用的是 Windows 7 系统。
  • 这些 AVI 文件使用什么编解码器?它们是恒定比特率吗?
  • @MultimediaMike 恐怕我不知道这两个问题的答案。我显然低估了我的问题的复杂性......

标签: r video


【解决方案1】:

据我所知,没有现成的包可以处理 R 中的视频文件(就像 matlab 一样)。这不是一个纯粹的 R 解决方案,但可以完成工作。我将 CLI 接口安装到 MediaInfo 并从 R 调用它。我使用 system 调用它。

wolf <- system("q:/mi_cli/mediainfo.exe Krofel_video2volk2.AVI", intern = TRUE)
wolf # output by MediaInfo

[1] "General"                                                            
 [2] "Complete name                            : Krofel_video2volk2.AVI"  
 [3] "Format                                   : AVI"                     
 [4] "Format/Info                              : Audio Video Interleave"  
 [5] "File size                                : 10.7 MiB"                
 [6] "Duration                                 : 11s 188ms"               
 [7] "Overall bit rate                         : 8 016 Kbps"              
 ...        
[37] "Channel count                            : 1 channel"               
[38] "Sampling rate                            : 8 000 Hz"                
[39] "Bit depth                                : 16 bits"                 
[40] "Stream size                              : 174 KiB (2%)"            
[41] "Alignment                                : Aligned on interleaves"  
[42] "Interleave, duration                     : 63 ms (1.00 video frame)"

# Find where Duration is (general) and extract it.
find.duration <- grepl("Duration", wolf)
wolf[find.duration][1]# 1 = General, 2 = Video, 3 = Audio
[1] "Duration                                 : 11s 188ms"

享受解析时间的乐趣。

【讨论】:

  • 我收到一条警告消息“运行命令 C:\\Users\\Documents\\MediaInfo\\MediaInfo.exe teste.avi”状态为 1”,但我找不到解决方案。你以前遇到过这个吗?但是,如果我从 CLI 运行命令海峡,一切都运行得很好,所以我假设它与 MediaInfo 无关。干杯
  • 运行时出现错误:system("C:\\Users\\Documents\\MediaInfo\\MediaInfo.exe teste.avi", intern = TRUE)
  • @PatraoPedro 在getwd() 中是teste.avi
  • 我尝试了两种不同的方法,其中 test.avi 位于 MediaInfo 文件夹 wolf
  • @PatraoPedro 将工作目录设置为 teste.avi 所在的位置,然后重试。
【解决方案2】:

这可能有点低级,但如果您要完成解析二进制数据的任务,请查找 AVI 规范的副本并弄清楚如何获取视频帧数和帧速率。

如果您使用十六进制编辑器查看其中一个 AVI 文件,您会在开头看到一系列 LIST 块。在这个块的更远一点将是一个vids 块。紧跟在vids 之后的应该是一个人类可读的视频四字符代码 (FourCC),用于指定视频编解码器,可能类似于摄像头的 mjpg (MJPEG) 或 avc1 (H.264)。之后的 20 个字节将以小端表示法存储 4 个字节,表示帧速率。跳过另外 4 个字节,然后接下来的 4 个字节将是另一个小端数,表示视频帧的总数。

我现在正在查看一个示例 AVI 文件,其中的数字是:帧速率 = 24 和帧数 = 0x37EB = 14315。计算结果为 9 分 56 秒,这对于该文件来说是准确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 2015-07-25
    • 2022-08-18
    • 1970-01-01
    • 2014-08-07
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多