簡體   English   中英

解析ffmpeg信息的正則表達式

[英]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}`); }); }

視頻演示 2

音頻演示 2

音頻/視頻交替演示 2


另一種方法是簡單地瞄准你喜歡捕捉的東西,也許一個更簡單的表達方式,例如,

(\d+)\s*fps

演示 3


設計:

  • 您想要捕獲的任何內容都將包含在捕獲組() ,例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM