我正在尝试使用正则表达式解密FFmpeg输出,但是我遇到了问题,因为有时它们不存在行,例如文件是音频文件而没有视频行。
视频的示例文字;
Seems stream 0 codec frame rate differs from container frame rate: 30000.00 (30000/1) -> 15.00 (15/1)
Input #0, avi, from 'making_of_divx5mp3.avi':
Duration: 00:27:46.60, start: 0.000000, bitrate: 154 kb/s
Stream #0.0: Video: mpeg4, yuv420p, 320x240 [PAR 1:1 DAR 4:3], 15 fps, 15 tbr, 15 tbn, 30k tbc
Stream #0.1: Audio: mp3, 24000 Hz, 2 channels, s16, 40 kb/s
At least one output file must be specified
音频的示例文字;
输入#0,ogg,来自'C:\ examplemedia \ Americanism_(Franklin_D._Roosevelt).ogg': 持续时间:00:04:21.24,开始:0.000000,比特率:49 kb / s 流#0.0:音频:vorbis,11025 Hz,单声道,s16,49 kb / s 必须至少指定一个输出文件
我的正则表达式
取值{2}时间[:] \ S(\ d {2} [:] \ d {2} [:] \ d {2})[。] \ d {2} [,] \ S {1}开始[:] \ S {1} \ d {1,} \ d {6} [,] \ S {1}比特率[。] [:]?\ S {1}(\ d {1, } \ SKB [/]或多个)。+
\ S {4}流\ S [#] \ d \ d [。] [:] \ SVIDEO [:](?\ W +)\ S(?\ W +)[,] \ S [,] \ S(?\ d {2,} [X] \ d {2,})。+
\ S {4}流\ S [#] \ d \ d [。] [:] \ sAudio [:] \ S(?\ W +)[,] \ S(?\ d + \ SHZ), ] \ S((\ d \ schannels |?单声道))[,] \ S(\ W +?)([,] \ S(\ d {2,} \ SKB [/] S)|?)
我尝试通过将一个更改为包含(regex |)来解决问题,并且它应该匹配NULL,但它会破坏我的正则表达式然后不返回任何内容。我认为这会有效,因为表达式从右到左阅读。
(\s{4}Stream\s[#]\d[.]\d[:]\sVideo[:]\s(?<videocodec>\w+)[,]\s(?<pixelformat>\w+)[,]\s(?<resolution>\d{2,}[x]\d{2,}).+|)
感谢您的帮助!
答案 0 :(得分:0)
也许你可以拆分字符串并分别处理每一行。因此,您将遍历这些行,并尝试将它们与可能的格式列表进行匹配。
EDIT 好吧保持一个正则表达式
将每行的正则表达式与'或'分隔,并用括号括起来。把量词放在最后。所以它最多可以匹配3行,匹配任何一种不同的行格式。
(audio_regex | video_regex | other_regex){1,3}