当前位置: 技术问答>linux和unix
od命令问题
来源: 互联网 发布时间:2017-05-06
本文导语: 48 for wav_file in `ls $audio_path | grep wav` 49 do 50 echo "$wav_file*******" 51 size=`ls -l $wav_file | awk '{print $5}'` 52 echo $size 53 if [ $size -gt 44 ] 5...
48 for wav_file in `ls $audio_path | grep wav`
49 do
50 echo "$wav_file*******"
51 size=`ls -l $wav_file | awk '{print $5}'`
52 echo $size
53 if [ $size -gt 44 ]
54 then
55 voice_len=`od -An -j40 -N4 -i ${audio_path}/$wav_file` # 语音数据的大小
56 actual_len=$(($voice_len+44)) # 语音文件的实际大小,44字节是语音文件头的大小
57 ls_len=`ls -l ${audio_path}/$wav_file | awk '{print $5}'`
58 echo "voice_len:$voice_len actual_len:$actual_len ls_len:$ls_len"
59 if test $actual_len -eq $ls_len # 文件复制完毕
60 then
61 yes|mv ${audio_path}/$wav_file $store_tmp_path
62 echo "#####################"
63 fi
64 fi
65 done
以上是一个脚本的片段 有的地方不懂 请大神一一解析一下:
1.od 命令使用 这个命令注释上说输出的是语音数据的大小 能详细解析一下吗?
2.该脚本一直在机器上运行audio_path路径下的文件是从其他地方复制过来的 为什么要加入那一些列的判断
而且判断文件是否复制完毕的条件 我也不明白
3.我获取得到了一个wav格式的文件 但是使用od -An -j40 -N4 -i test.wav 输出结果是0 但是ls -l显示文件的大小13452 为什么会出现这种状况呢 而且我把该wav文件拿出 使用播放器播放时 无法播放 这是为什么呢
49 do
50 echo "$wav_file*******"
51 size=`ls -l $wav_file | awk '{print $5}'`
52 echo $size
53 if [ $size -gt 44 ]
54 then
55 voice_len=`od -An -j40 -N4 -i ${audio_path}/$wav_file` # 语音数据的大小
56 actual_len=$(($voice_len+44)) # 语音文件的实际大小,44字节是语音文件头的大小
57 ls_len=`ls -l ${audio_path}/$wav_file | awk '{print $5}'`
58 echo "voice_len:$voice_len actual_len:$actual_len ls_len:$ls_len"
59 if test $actual_len -eq $ls_len # 文件复制完毕
60 then
61 yes|mv ${audio_path}/$wav_file $store_tmp_path
62 echo "#####################"
63 fi
64 fi
65 done
以上是一个脚本的片段 有的地方不懂 请大神一一解析一下:
1.od 命令使用 这个命令注释上说输出的是语音数据的大小 能详细解析一下吗?
2.该脚本一直在机器上运行audio_path路径下的文件是从其他地方复制过来的 为什么要加入那一些列的判断
而且判断文件是否复制完毕的条件 我也不明白
3.我获取得到了一个wav格式的文件 但是使用od -An -j40 -N4 -i test.wav 输出结果是0 但是ls -l显示文件的大小13452 为什么会出现这种状况呢 而且我把该wav文件拿出 使用播放器播放时 无法播放 这是为什么呢
|
你需要了解wav文件头才能看懂这个脚本。
8KHz采样、16比特量化的线性PCM语音信号的WAVE文件头格式表(共44字节)
偏移地址 字节数 数据类型 内容 文件头定义为
00H 4 char "RIFF" char riff_id[4]="RIFF"
04H 4 long int 文件总长-8 long int size0=文总长-8
08H 8 char "WAVEfmt " char wave_fmt[8]
10H 4 long int 10 00 00 00H(PCM) long int size1=0x10
14H 2 int 01 00H int fmttag=0x01
16H 2 int int channel=1 或2
18H 4 long int 采样率 long int samplespersec
1CH 4 long int 每秒播放字节数 long int bytepersec
20H 2 int 采样一次占字节数 int blockalign=声道数*量化数/8
22H 2 int 量化数 int bitpersamples=8或16
24H 4 char "data" char data_id="data"
28H 4 long int 采样数据字节数 long int size2=文长-44
2CH 到文尾 char 采样数据
根据上面的表格可以看出,28H(十进制的40)后面的4个字节存放的是wav文件的大小
od命令的作用就是获取这个数值,具体的-j40表示跳过前面40个字节,-N4表示获取4个字节。
实际上就是获取了28H后面4个字节的内容,也就是这个wav文件应该是多大。
因为可能在脚本执行的那个时间点,某个wav文件还没有复制完毕,比如刚刚复制了50%
这种情况下,od命令获取的“完整大小”$actual_len和ls命令看到的“当前大小”会不一致
于是脚本就知道了该wav还没有复制完,暂时不执行后面的mv命令
wav文件有很多种编码方式,第40字节到第44字节存放的不一定是文件大小。
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。