VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

聲音相關問題

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
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"

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作