|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
bsh6919
註冊時間: 2007-05-19 文章: 4
第 1 樓
|
發表於: 星期六 七月 02, 2011 4:02 pm 文章主題: 聲音相關問題 |
|
|
本人需求如下:
有一段聲音檔,長度不一定,假設在 00:25 開始有聲音,00:38結束;在 01:38 開始有聲音,02:01結束,要如何能得到開始及結束的時間?
有人能指引方向,或有現成程式已有此功能,或有人會寫此程式,請告知.
感激不盡!!! |
|
回頂端 |
|
|
danielkao
註冊時間: 2011-04-21 文章: 31
第 2 樓
|
發表於: 星期四 八月 25, 2011 4:39 pm 文章主題: Re: 聲音相關問題 |
|
|
使用 TIMER 控制 |
|
回頂端 |
|
|
garfield Site Admin
註冊時間: 2003-01-30 文章: 2157
第 3 樓
|
發表於: 星期五 八月 26, 2011 2:25 pm 文章主題: |
|
|
參考: 如何繪出Wave波形 : http://sunh.hosp.ncku.edu.tw/~cww/html/q00266.html
你研究一下它有畫出波形的地方就是有聲音的地方.
怕來源不見了,貼上它的vb程式
代碼: |
Option Explicit
'PCM 音檔檔頭
Private Type PCMFORM '以下為44byte的檔頭
wRiffFormatTag As String * 4 '1~4存放的是RIFF字串
wfdataSize As Long '5~8存放的是資料區塊大小
' NOTE : 資料區塊大小=(檔案大小-8)
wFormatTag As String * 4 '9~12存放的是WAVE字串
wFormatName As String * 4 '13~16存放的是子區塊識別名稱
wCsize As Long '17~20存放的是子區塊大小
wWavefmt As Integer '21~22存放的是聲檔格式,0x0001表PCM格式
wChannels As Integer '23~24存放的是聲道數
wSamplesPerSec As Long '25~28存放的每秒取樣數
wBytePerSec As Long '29~32存放的是每秒資料量
' NOTE : 每秒資料量=(聲道數*位元數*每秒取樣數/8)
wBytePerSample As Integer '33~34存放的是子區塊位元組
' NOTE : 子區塊位元組=(位元數/8)
wBitsPerSample As Integer '35~36存放的是取樣位組元數
wData As String * 4 '存放的是data字串
wDataSize As Long '實際聲檔大小
' NOTE : 這個值為檔案大小減去檔頭(44BYTE)後的值
End Type
Private Type bdData '用來儲存8位元雙聲道的資料
bData1 As Byte '左聲道
bData2 As Byte '右聲道
End Type
Private Type idData '用來儲存16位元雙聲道的資料
iData1 As Integer '左聲道
iData2 As Integer '右聲道
End Type
'傳入Picture物件及檔名
Public Sub PaintWaveForm(pic As PictureBox, sFileName As String)
Dim bData() As Byte '用來存放8bit單聲道音檔資料
Dim diData() As idData '用來儲存8位元雙聲道的資料
Dim iData() As Integer '用來存放16bit音檔資料
Dim dbData() As bdData '用來儲存16位元雙聲道的資料
Dim pHandle As PCMFORM '檔頭
Dim i As Long, lDataSize As Long
Open sFileName For Binary As #1 '�}啟來源檔
Get #1, 1, pHandle '讀出44Byte的檔頭
If pHandle.wBitsPerSample = 8 Then '這是8bit音檔
If pHandle.wChannels = 1 Then '單聲道
ReDim bData(1 To pHandle.wDataSize) '�]定Buffer大小以讀入檔案
'pHandle.wDataSize 由檔頭可知是實際生檔大小
Get #1, 45, bData '將檔案讀到�}列
lDataSize = UBound(bData) '取得資料筆數
pic.Scale (0, -256)-(pic.ScaleWidth, 0) '�]定繪圖區域座標
'8位元音檔值是界於0~256
If pic.ScaleWidth < lDataSize Then '如果繪圖區域小於資料大小 有些資料點必須空過不畫
For i = 2 To pic.ScaleWidth
pic.Line ((i - 1), -bData(((i - 1) * pHandle.wDataSize / pic.ScaleWidth)))-((i), -bData(((i) * pHandle.wDataSize / pic.ScaleWidth)))
Next
Else '將所有資料點繪出
For i = 2 To lDataSize
pic.Line (i - 1, -bData(i - 1))-(i, -bData(i))
Next
End If
ElseIf pHandle.wChannels = 2 Then '雙聲道 須分�}繪出作右聲道
ReDim dbData(1 To pHandle.wDataSize \ 2)
Get #1, 45, dbData '將檔案讀入�}列
lDataSize = UBound(dbData) '取得資料筆數
pic.Scale (0, -512)-(pic.ScaleWidth, 0)
If pic.ScaleWidth < lDataSize Then
For i = 2 To pic.ScaleWidth
pic.Line (i - 1, -dbData((i - 1) * lDataSize / pic.ScaleWidth).bData1 - 256)-(i, -dbData(i * lDataSize / pic.ScaleWidth).bData1 - 256)
pic.Line (i - 1, -dbData((i - 1) * lDataSize / pic.ScaleWidth).bData2)-(i, -dbData(i * lDataSize / pic.ScaleWidth).bData2)
Next
Else
For i = 2 To lDataSize
pic.Line (i - 1, -dbData(i - 1).bData1 - 256)-(i, -dbData(i).bData1 - 256)
pic.Line (i - 1, -dbData(i - 1).bData2)-(i, -dbData(i).bData2)
Next
End If
End If
ElseIf pHandle.wBitsPerSample = 16 Then
If pHandle.wChannels = 1 Then '單聲道
ReDim iData(1 To pHandle.wDataSize / 2)
Get #1, 45, iData
lDataSize = UBound(iData)
pic.Scale (0, -32767)-(pic.ScaleWidth, 32768)
If pic.ScaleWidth < lDataSize Then
For i = 2 To pic.ScaleWidth
pic.Line (i - 1, -iData((i - 1) * lDataSize / pic.ScaleWidth))-(i, -iData(i * lDataSize / pic.ScaleWidth))
Next
Else
For i = 2 To lDataSize
pic.Line (i - 1, -iData(i - 1))-(i, -iData(i))
Next
End If
ElseIf pHandle.wChannels = 2 Then '雙聲道
ReDim diData(1 To pHandle.wDataSize \ 4)
Get #1, , diData
lDataSize = UBound(diData)
pic.Scale (0, -65535)-(pic.ScaleWidth, 65535)
If pic.ScaleWidth < lDataSize Then
For i = 2 To pic.ScaleWidth
pic.Line (i - 1, -diData((i - 1) * lDataSize / pic.ScaleWidth).iData1 - 32768)-(i, -diData(i * lDataSize / pic.ScaleWidth).iData1 - 32768)
pic.Line (i - 1, -diData((i - 1) * lDataSize / pic.ScaleWidth).iData2 + 32768)-(i, -diData(i * lDataSize / pic.ScaleWidth).iData2 + 32768)
Next
Else
For i = 2 To lDataSize
pic.Line (i - 1, -diData(i - 1).iData1 - 32768)-(i, -diData(i).iData1 - 32768)
pic.Line (i - 1, -diData(i - 1).iData2 + 32768)-(i, -diData(i).iData2 + 32768)
Next
End If
End If
Else
Exit Sub
End If
Close
End Sub
如果要將C:\u.wav繪在Picture1上只要這樣
PaintWaveForm Picture1 ,"C:\u.wav"
|
_________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|