[英]Regular expression to parse ffmpeg info
這是我的代碼:
Input #0, mpegts, from 'tcp://127.0.0.1:3456':
Duration: N/A, start: 1809.522000, bitrate: N/A
Program 256
Metadata:
service_name : AIR_CH_521_6M
service_provider: ITE
Stream #0:0[0x7d1]: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1920x1080, 30 fps, 30 tbr, 90k tbn, 60 tbc
Stream #0:1[0x7d2]: Audio: mp3 ([4][0][0][0] / 0x0004), 0 channels
如何從此字符串中以數組形式獲取 fps、像素格式、視頻編解碼器、音頻編解碼器、輸入分辨率、輸出分辨率和音頻通道?
根據我迄今為止的努力,這是我所能得到的,因為我不是正則表達式專家:
/Video: ([^\r\n]*), ([^,]*), ([0-9]{1,4})x([0-9]{1,4})/iu
編輯:我嘗試了另一個視頻,但正則表達式不匹配。 知道為什么嗎?
data :ffmpeg version 2.8.15-0ubuntu0.16.04.1 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609
configuration: --prefix=/usr --extra-version=0ubuntu0.16.04.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
data : libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 40.101 / 5. 40.101
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
data :Metadata:
Server NGINX
width 1280.00
height 720.00
displayWidth 1280.00
data : displayHeight 720.00
duration 0.00
framerate 30.00
fps 30.00
videodatarate 0.00
videocodecid 7.00
audiodatarate 125.00
audiocodecid 10.00
data :Input #0, live_flv, from 'rtmp://localhost/test/test':
Metadata:
Server : NGINX
displayWidth : 1280
data : displayHeight : 720
fps : 30
profile :
level :
Duration: 00:00:00.00, start: 11168.744000, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 30.30 fps, 30 tbr, 1k tbn, 60 tbc
Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp, 128 kb/s
Output #0, mpegts, to '/dev/null':
Metadata:
Server : NGINX
displayWidth : 1280
displayHeight : 720
fps : 30
profile :
level :
encoder : Lavf56.40.101
Stream #0:0: Video: h264, yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 30.30 fps, 30 tbr, 90k tbn, 1k tbc
Stream #0:1: Audio: aac, 44100 Hz, stereo, 128 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
data :frame= 54 fps=0.0 q=-1.0 size= 825kB time=00:00:02.22 bitrate=3031.6kbits/s
data :frame= 66 fps= 60 q=-1.0 size= 1004kB time=00:00:02.74 bitrate=3002.7kbits/s
data :frame= 82 fps= 50 q=-1.0 size= 1224kB time=00:00:03.34 bitrate=2998.5kbits/s
這是正則表達式不匹配的同一命令的另一個文件的輸入: https : //regex101.com/r/Vyq5kD/4
我猜你可以簡單地設計一些類似於,
video:\s*([a-z0-9]+)\s*\(([^)]*)\)\s*\((\[\d+\]\s*)(\[\d+\]\s*)(\[\d+\]\s*)(\[\d+\]\s*)\s*\/\s*[0-9]+x[a-z0-9]+\)\s*,\s*[a-z0-9]+\(([^)]*)\)\s*,\s*([0-9]+x[0-9]+)\s*,\s*([0-9]+)\s+([a-z]+)\s*,\s*([0-9]+)\s*([a-z]+)\s*,\s*(\d+[a-z]*)\s*([a-z]+)\s*,\s*([0-9]+)\s*([a-z]+)
或者
audio:\s*([a-z0-9]+)\s*\((\[\d+\]\s*)(\[\d+\]\s*)(\[\d+\]\s*)(\[\d+\]\s*)\s*\/\s*[0-9]+x[a-z0-9]+\)\s*,\s*([0-9]+)\s*([a-z]+)
並提取/捕獲您想要的內容,並且您可能希望根據您可能擁有的輸入更改邊界。
如果你想簡化/修改/探索表達式,它已經在regex101.com 的右上角面板中進行了解釋。 如果您願意,您還可以在此鏈接中觀看它如何與某些示例輸入匹配。
const regex = /video:\\s*([a-z0-9]+)\\s*\\(([^)]*)\\)\\s*(\\((\\[\\d+\\]\\s*)(\\[\\d+\\]\\s*)(\\[\\d+\\]\\s*)(\\[\\d+\\]\\s*)\\s*\\/\\s*[0-9]+x[a-z0-9]+\\)\\s*)?,\\s*[a-z0-9]+\\(([^)]*)\\)\\s*,\\s*([0-9]+x[0-9]+)(\\s*\\[[^\\]]*\\])?,([^,\\r\\n]*),([^,\\r\\n]*),([^,\\r\\n]*),([^,\\r\\n]*),?([^,\\r\\n]*)?/gmi; const str = ` Stream #0:0[0x7d1]: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1920x1080, 30 fps, 30 tbr, 90k tbn, 60 tbc Stream #0:1[0x7d2]: Audio: mp3 ([4][0][0][0] / 0x0004), 0 channels Stream #0:0: Video: h264 (High), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 1k tbn, 60 tbc Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp, 128 kb/s Output #0, mpegts, to '/dev/null': Stream #0:0: Video: h264 (High), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 30 fps, 30 tbr, 90k tbn, 1k tbc Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp, 128 kb/s Stream mapping:`; let m; while ((m = regex.exec(str)) !== null) { // This is necessary to avoid infinite loops with zero-width matches if (m.index === regex.lastIndex) { regex.lastIndex++; } // The result can be accessed through the `m`-variable. m.forEach((match, groupIndex) => { console.log(`Found match, group ${groupIndex}: ${match}`); }); }
另一種方法是簡單地瞄准你喜歡捕捉的東西,也許一個更簡單的表達方式,例如,
(\d+)\s*fps
您想要捕獲的任何內容都將包含在捕獲組()
,例如yuv420p
[a-z0-9]+
將變為([a-z0-9]+)
。
我們會選擇最長的字符串輸入,並在其中合並所有內容,然后對於任何其他缺失值的字符串,我們會添加一個?
在表達式中那些缺失值的末尾,使其成為可選的。
這將為您提供單獨變量和數組中的視頻和音頻信息。
const regex = /^(?:.|\\n)*Video\\:\\s(\\w+\\d+)\\s\\(([\\w\\s]+)\\).*\\,\\s([\\w\\d]+)\\(([\\w\\s]+)\\)\\,\\s{1}(\\d+x\\d+)[,\\s]+(\\d{0,4}\\sfps)\\,\\s(\\d+\\stbr)\\,\\s(\\d+k\\stbn)\\,\\s(\\d+\\stbc)\\s+.*Audio\\:\\s(.*)\\,\\s(\\d+\\s\\w+)$/
這是測試鏈接: https : //regex101.com/r/0gEsnN/2
這是代碼:
const regex = /^(?:.|\\n)*Video\\:\\s(\\w+\\d+)\\s\\(([\\w\\s]+)\\).*\\,\\s([\\w\\d]+)\\(([\\w\\s]+)\\)\\,\\s{1}(\\d+x\\d+)[,\\s]+(\\d{0,4}\\sfps)\\,\\s(\\d+\\stbr)\\,\\s(\\d+k\\stbn)\\,\\s(\\d+\\stbc)\\s+.*Audio\\:\\s(.*)\\,\\s(\\d+\\s\\w+)$/; const input = `Input #0, mpegts, from 'tcp://127.0.0.1:3456': Duration: N/A, start: 1809.522000, bitrate: N/A Program 256 Metadata: service_name : AIR_CH_521_6M service_provider: ITE Stream #0:0[0x7d1]: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1920x1080, 30 fps, 30 tbr, 90k tbn, 60 tbc Stream #0:1[0x7d2]: Audio: mp3 ([4][0][0][0] / 0x0004), 0 channels`; const resultArr = input.match(regex); const values = resultArr.slice(1); console.log("Values : ", values); const [,vC1,vC2, vC3,vC4, vRes, vFps, vTbr, vTbn, vTbc, aCodec, aChannels] = resultArr; console.log("vC1 : ", vC1); console.log("vC2 : ", vC2); console.log("vC3 : ", vC3); console.log("vC4 : ", vC4); console.log("vRes : ", vRes); console.log("vFps : ", vFps); console.log("vTbr : ", vTbr); console.log("vTbn : ", vTbn); console.log("vTbc : ", vTbc); console.log("aCodec : ", aCodec); console.log("aChannels : ", aChannels);
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.