考虑此输出
General
Complete name : sample.mp4
Format : MPEG-4
Format profile : QuickTime
Codec ID : qt
File size : 37.3 MiB
Duration : 9mn 56s
Overall bit rate mode : Variable
Overall bit rate : 525 Kbps
Writing application : Lavf52.73.0
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : Baseline@L3.0
Format settings, CABAC : No
Format settings, ReFrames : 3 frames
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 9mn 56s
Bit rate : 400 Kbps
Width : 424 pixels
Height : 240 pixels
Display aspect ratio : 16:9
Frame rate mode : Constant
Frame rate : 24.000 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.164
Stream size : 29.9 MiB (80%)
Writing library : x264 core 98 r1629 9d1c441
Encoding settings : cabac=0 / ref=3 / deblock=1:0:0 / analyse=0x1:0x111 / me=hex / subme=7 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=0 / 8x8dct=0 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=64 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / constrained_intra=0 / bframes=0 / weightp=0 / keyint=90 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=40 / rc=abr / mbtree=1 / bitrate=400 / ratetol=10.0 / qcomp=0.60 / qpmin=10 / qpmax=51 / qpstep=4 / vbv_maxrate=768 / vbv_bufsize=3000 / ip_ratio=1.41 / aq=1:1.00 / nal_hrd=none
Language : English
Audio
ID : 2
Format : AAC
Format/Info : Advanced Audio Codec
Format profile : LC
Codec ID : 40
Duration : 9mn 56s
Bit rate mode : Variable
Bit rate : 99.1 Kbps
Channel(s) : 2 channels
Channel positions : Front: L R
Sampling rate : 48.0 KHz
Compression mode : Lossy
Stream size : 7.04 MiB (19%)
Language : English
这是显示媒体信息的命令的示例输出。这在标题"视频"下包含一个比特率,在"音频"标题下包含另一个比特率。我的目标是将这两个变量存储为 BASH 脚本中的不同变量。
不能使用行号进行 grep,因为有些文件可能有音频部分,有些文件没有。那么,有什么方法可以将这两个同名的值保存到不同的变量中呢?
您可以使用 sed 分别打印视频和音频部分,然后使用另一个 sed 提取比特率。假设信息在文件中。
VIDEO=`sed -n '/^Video$/,/^$/p' file`
AUDIO=`sed -n '/^Audio$/,/^$/p' file`
VBR=`echo $VIDEO | sed -nr 's/^Bit rate +: //p'`
ABR=`echo $AUDIO | sed -nr 's/^Bit rate +: //p'`
至于提取视频和音频章节:
sed -n
选项意味着不打印- 与
/.../,/.../
我定义了一个起始正则表达式和一个结束正则表达式 -
/^Audio$/
意味着整行只包含"音频" -
/^$/
表示空行 p
命令打印上面定义的范围(覆盖范围 -n)
如果 AUDIO
的输出总是在视频之后,则以下内容将起作用:
grep 'Bit rate[ ]*:' t|sed -n '1p'|cut -f2 -d':'|sed 's/^ //g'
用于视频和
grep 'Bit rate[ ]*:' t|sed -n '1p'|cut -f2 -d':'|sed 's/^ //g'
对于音频。
aman@a1:~$ VIDEO=$(grep 'Bit rate[ ]*:' t|sed -n '1p'|cut -f2 -d':'|sed 's/^ //g')
aman@a1:~$ AUDIO=$(grep 'Bit rate[ ]*:' t|sed -n '2p'|cut -f2 -d':'|sed 's/^ //g')
aman@a1:~$ echo $VIDEO
400 Kbps
aman@a1:~$ echo $AUDIO
99.1 Kbps
使用 sed 过滤视频线,然后 grep 速率并存储在video_bitrate中。对音频执行相同的操作。
编辑:与Raul Andres使用awk同时提出的方法完全相同。