首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

od命令有关问题

2013-12-30 
od命令问题 48for wav_file in `ls $audio_path | grep wav` 49do 50echo $wav_file******* 51size`ls

od命令问题
 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文件拿出 使用播放器播放时 无法播放 这是为什么呢
[解决办法]

引用
1.od 命令使用 这个命令注释上说输出的是语音数据的大小 能详细解析一下吗?

你需要了解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文件应该是多大。

引用
2.该脚本一直在机器上运行 audio_path 路径下的文件是从其他地方复制过来的 为什么要加入那一些列的判断
而且判断文件是否复制完毕的条件 我也不明白

因为可能在脚本执行的那个时间点,某个wav文件还没有复制完毕,比如刚刚复制了50%
这种情况下,od命令获取的“完整大小”$actual_len和ls命令看到的“当前大小”会不一致
于是脚本就知道了该wav还没有复制完,暂时不执行后面的mv命令

引用
3.我获取得到了一个wav格式的文件 但是使用od -An -j40 -N4 -i test.wav 输出结果是0 但是ls -l显示文件的大小13452 为什么会出现这种状况呢  而且我把该wav文件拿出 使用播放器播放时 无法播放 这是为什么呢

wav文件有很多种编码方式,第40字节到第44字节存放的不一定是文件大小。

热点排行