参数: lpFilename:指向 MP3 文件名的指针,用于从
中获取信息 lpInfoStruct:
指向将在返回
时接收信息的MP3INFO结构的指针 此功能扫描整个 MP3 并计算比特率、时间和其他一些信息。
MP3INFO STRUCT fileSize:MP3 文件的大小
fileLength:文件
的长度,单位为毫秒 bitrate:
比特率,单位为位/秒。此值可以为负数,在这种情况下,mp3 具有可变比特率。该值是平均比特率,已否定。
频率:MP3 的频率,单位为赫兹(44100、22050 等)
nFrames:MPEG 帧数。注意:不要依赖此值,它并不总是正确的(还)。
MP3INFO完
该过程针对大小进行了优化。
返回:
失败时为 false,否则为 true
.data
;V1 layer 3 bitrates
bitrateTableV1 dw -1,32,40,48,56,64,80,96,112,128,160,192,224,256,320,-1
;V2/2.5 layer 3 bitrates
bitrateTableV2 dw -1,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1
samplerateTableV1 dw 44100,48000,32000
samplerateTableV2 dw 22050,24000,16000
samplerateTableV2_5 dw 11025,12000,8000
.code
MP3INFO STRUCT
fileSize dword ? ; in bytes
fileLength dword ? ; in miliseconds
bitrate sdword ? ; in bps. if negative:
; variable bitrate,bitrate=negated average
frequency dword ? ; in Hertz
nFrames dword ? ; number of MPEG frames.
; Note: do not rely on this value,
; it isn't always correct (yet).
MP3INFO ENDS
GetMP3Info proc uses esi edi ebx lpFilename:DWORD, lpInfoStruct:DWORD
LOCAL hFile:DWORD
LOCAL hMap:DWORD
LOCAL pMap:DWORD
LOCAL totalbitrate:DWORD
LOCAL srTablePtr:DWORD
xor ebx, ebx
mov hFile, ebx
mov hMap, ebx
mov pMap, ebx
mov edi, lpInfoStruct
push edi
or eax, -1
mov ecx, (sizeof MP3INFO) / 4
rep stosd
mov totalbitrate, ebx
assume edi:PTR MP3INFO
pop edi
mov [edi].nFrames, ebx
invoke CreateFile, lpFilename, GENERIC_READ, FILE_SHARE_READ,
ebx, OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN OR FILE_FLAG_NO_BUFFERING, ebx
cmp eax, INVALID_HANDLE_VALUE
je _invalid
mov hFile, eax
invoke CreateFileMapping, eax, ebx, PAGE_READONLY, ebx,ebx,ebx
or eax, eax
jz _invalid
mov hMap, eax
invoke MapViewOfFile, eax, FILE_MAP_READ,ebx,ebx,ebx
or eax, eax
jz _invalid
mov pMap, eax
mov esi, eax
invoke GetFileSize, hFile, NULL
mov [edi].fileSize, eax
lea ebx, [eax+esi]
_gotonextframe:
; find first 8 bits of sync bits
cmp byte ptr [esi], 0FFh
je @F
inc esi
cmp esi, ebx
jb _gotonextframe
jmp _done
;possible first 8 sync bits found
@@:
inc esi
cmp esi, ebx
jae _done
mov al, [esi]
mov cl, al
and cl, 11100000b
cmp cl, 11100000b
jne _gotonextframe
inc esi
_frame_found:
mov cl, al
and cl, 00011110b
mov edx, offset bitrateTableV1
mov srTablePtr, offset samplerateTableV1
cmp cl, 00011010b ;MPEG v1, layer 3?
je _frame_continue
mov edx, offset bitrateTableV2
mov srTablePtr, offset samplerateTableV2
cmp cl, 00010010b ;MPEG v2, layer 3?
je _frame_continue
mov srTablePtr, offset samplerateTableV2_5
cmp cl, 00000010b ;MPEG v2.5, layer 3
jne _gotonextframe ;find next frame
PrintText "falling"
;fall through...
_frame_continue:
PrintText "---frame continue---"
mov eax, ebx
sub eax, esi
cmp eax, 2 ;at least 2 bytes readable?
jb _done
movzx eax, byte ptr [esi]
mov ecx, eax
shr al, 4
movsx eax, word ptr [edx][2*eax]
cmp eax, -1
je _gotonextframe
sub esi, 2 ;point back to start of frame, as framesize is added later
; eax is bitrate
add totalbitrate, eax
mov edx, [edi].bitrate
cmp edx, -1
jne _bitrate_already_set
mov [edi].bitrate, eax
jmp _fixed_bitrate_so_far
_bitrate_already_set:
cmp eax, edx ;current bitrate same as set bitrate?
je _fixed_bitrate_so_far
;variable bitrate
and [edi].bitrate, 0 ;set to zero indicating variable bitrate
;fall through...
_fixed_bitrate_so_far:
xor edx, edx ; init framesize to zero
shr ecx, 2
setc dl ;last bit shifted out is padding bit,
; if set increase framesize by one
and ecx, 3
cmp ecx, 3
jne @F
inc esi
cmp esi, ebx
jae _done
jmp _gotonextframe
@@:
shl ecx, 1
add ecx, srTablePtr
movzx ecx, word ptr [ecx]
mov [edi].frequency, ecx
;FrameSize = 144 * BitRate / SampleRate + Padding
; eax = bitrate(in kbps, needs to be converted to bps yet)
; ecx = sampleRate
; edx = padding
; framesize = 144 * eax / ecx + edx
push edx
mov edx, 144*1000
cmp srTablePtr, offset samplerateTableV1
je @F
mov edx, 72*1000
@@:
mul edx
div ecx
pop edx
add edx, eax
; edx is framesize now
add esi, edx
cmp esi, ebx
jae _done ; frame bigger than file, file is cut
inc [edi].nFrames
jmp _gotonextframe
_invalid:
xor eax, eax
jmp _exit
_done:
mov ebx, 1000
mov ecx, [edi].nFrames ;get number of frames
mov eax, [edi].bitrate ;get bitrate in kbps
mul ebx ;*1000, in bpsd
mov [edi].bitrate, eax ;set new bitrate, in bps
or eax, eax ;bitrate zero?
jnz _fixed_bitrate ;if not, fixed
mov eax, totalbitrate ;else, variable. get total (sum of all bitrates)
mul ebx ;multiple by 1000
or ecx, ecx ;no frames?
jz _invalid ;bye
div ecx ;divide by number of frames
neg eax ;negate, indicating a variable bitrate
mov [edi].bitrate, eax
_fixed_bitrate:
; 1152 = # of samples in one frame for layer 3 mpegs
mov ebx, 1152*1000
mov eax, [edi].nFrames
xor edx, edx
mul ebx
mov ebx, [edi].frequency
or ebx, ebx
jz _invalid
div ebx
mov [edi].fileLength, eax ;set filelengths, in msecs
;calculate time
;bitrate
assume edi:nothing
xor eax, eax
inc eax
_exit:
push eax
mov eax, pMap
or eax, eax
jz @F
invoke UnmapViewOfFile, eax
@@:
mov eax, hMap
or eax, eax
jz @F
invoke CloseHandle, eax
@@:
mov eax, hFile
or eax, eax
jz @F
invoke CloseHandle, eax
@@:
pop eax
ret
GetMP3Info endp
没有合适的资源?快使用搜索试试~ 我知道了~
常用功能汇编语言代码汇总,例如:ASCII转换,浮点操作,网络,字符串,排序等
共39个文件
txt:39个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 55 浏览量
2024-02-08
15:05:27
上传
评论
收藏 35KB ZIP 举报
温馨提示
常用功能汇编语言代码汇总,包括:ASCII 至 DWORD,RegWrite,RegReadStr,RegRead, Tokenizer,十六进制字符串转 DWORD,浮点操作,缓冲区对齐计算器,GetFeaturesFlags,Exists,Day of Week,从资源中提取文件,DecToBin,MP3 信息 [比特率/时间/...],OneZeroMany flags 案例,WinIO 原型,一年中的某一天,GetLastError Handling,64 bit to dec ASCIIZ - 2 with MMX,将 64 位无符号整数转换为十进制 ASCIIZ 字符串,无 MMX 指令集的无符号 64 位整数转换为十进制 ASCIIZ 字符串,阻止多个实例,重新排序任务栏项,在屏幕上居中窗口,终止 TCP 连接,IPADDR 和 PORTNR 宏,搜索InString,IsExtensionInList,wsprintf_sci,多字符串替换,十六进制 ASCIIZ 字符串转 dword,Knuth-Morris-Pratt 字符串搜索算法,在十进制字符串中设置逗号分隔符
资源推荐
资源详情
资源评论
收起资源包目录
常用功能汇编语言代码汇总.zip (39个子文件)
常用功能汇编语言代码汇总
GetLastError Handling.txt 2KB
多字符串替换.txt 4KB
IsExtensionInList.txt 1KB
十六进制字符串转 DWORD.txt 766B
IPADDR 和 PORTNR 宏.txt 839B
wsprintf_sci.txt 3KB
WinIO 原型.txt 672B
使用 MMX 插入字符串.txt 1KB
OneZeroMany flags 案例.txt 1KB
Knuth-Morris-Pratt 字符串搜索算法.txt 3KB
缓冲区对齐计算器.txt 1KB
DecToBin.txt 527B
RegReadStr.txt 420B
内联 FP 常量(宏).txt 1KB
Unsigned 64bit interger to dec ASCIIZ without MMX.txt 2KB
十六进制 ASCIIZ 字符串转 dword.txt 1KB
MP3 信息 [比特率时间...].txt 7KB
Exists.txt 528B
从增量值计算角度.txt 2KB
64 bit to dec ASCIIZ - 2 with MMX.txt 2KB
重新排序任务栏项.txt 4KB
在十进制字符串中设置逗号分隔符.txt 904B
InString2.txt 3KB
计算 ASCIIZ 字符串的长度.txt 957B
Tokenizer.txt 2KB
Day of Week.txt 3KB
ASCII 至 DWORD.txt 843B
在屏幕上居中窗口.txt 789B
RegRead.txt 434B
从资源中提取文件.txt 2KB
阻止多个实例.txt 1KB
InString.txt 2KB
终止 TCP 连接.txt 1KB
RegWrite.txt 366B
power of X.txt 172B
非均匀平均值.txt 1KB
GetFeaturesFlags.txt 2KB
64 bit to deciamal ASCIIZ with MMX.txt 2KB
DoY(一年中的某一天).txt 1KB
共 39 条
- 1
资源评论
新华
- 粉丝: 8472
- 资源: 609
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功