国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

無外部控件制作多媒體播放器(三)

2024-07-21 02:16:09
字體:
來源:轉載
供稿:網友

asf全名為高級系統格式,是ms大力推寵的一種媒體格式,并已得到廣泛支持。其最主要的分支就是用于音頻的wma與視頻的wmv,當然還有asf自身。
在下面地址可下載到asf格式的說明文檔:
http://www.microsoft.com/windows/windowsmedia/format/asfspec.aspx

asf格式由一個個不同功能的asf對象組成,每個對象都有一個guid做標識,你只需識別對象后,按對象格式讀結構,就能找到你要的信息。
媒體信息內容都在asf頭部對象asf_header_object中,頭部對象又包含若干子對象,其中與媒體信息有關的對象也就三個:asf_codec_list_object、asf_content_description_object、asf_extended_content_description_object,本文也就是針對這三個對象的讀寫。

'asf格式的幾個與音樂信息相關的對象
private const asf_header_object = "{75b22630-668e-11cf-a6d9-00aa0062ce6c}"
private const asf_codec_list_object = "{86d15240-311d-11d0-a3a4-00a0c90348f6}"
private const asf_content_description_object = "{75b22633-668e-11cf-a6d9-00aa0062ce6c}"
private const asf_extended_content_description_object = "{d2d0a440-e307-11d2-97f0-00a0c95ea850}"
'guid對象標識
private type guid
    dwdata1 as long
    wdata2 as integer
    wdata3 as integer
    abdata4(7) as byte
end type
'音樂類型,我自己定義的,不是標準喲
private enum mediatype
    mcimidi = 1
    mcimp3 = 2
    mciasf = 4
    mcivideo = 8
    mciwave = 16
end enum
'裝載音樂信息的結構
private type musicinfo
    filename as string
    musictype as mediatype
    title as string
    artist as string
    album as string
    year as string
    lyrics as string
    writer as string
    composer as string
    bits as string
    sample as string
    length as long
end type
'asf對象標識結構
private type objheader
  id as guid
  size(1) as long
end type
'asf文件頭對象結構
private type asfheader
    headerinfo as objheader
    numofheader as long
    reserved1 as byte
    reserved2 as byte
end type
'asf內容描述結構
private type contentdescription
    titlelength as integer
    authorlength as integer
    copyrightlength as integer
    descriptionlength as integer
    ratinglength as integer
end type
'asf描述標簽結構
private type descriptorvalue
    type as integer
    length as integer
end type

private function getasfinfo(udtinfo as musicinfo) as boolean
    dim asfh as asfheader, bo as objheader, tmpinfo as musicinfo
    dim fd as contentdescription, dv as descriptorvalue, gd as guid
    dim a() as string, b() as byte, pos as long, freeno as integer, efl as integer
    dim s as string, i as long, k as integer, l as long, j as long
    dim en as string, vl as string
   
    on error goto fail
    freeno = freefile
    pos = 1
    open udtinfo.filename for binary as #freeno
    tmpinfo = udtinfo
    with tmpinfo
        get #freeno, pos, asfh
        s = guidtostr(asfh.headerinfo.id)
        if s <> asf_header_object then goto fail
        pos = pos + len(asfh)
        for l = 1 to asfh.numofheader
            get #freeno, pos, bo
            s = guidtostr(bo.id)
            select case s
                case asf_codec_list_object
                    get #freeno, , gd
                    get #freeno, , i
                    for j = 1 to i
                        get #freeno, , dv
                        redim b(dv.length * 2 - 1)
                        get #freeno, , b
                        get #freeno, , efl
                        redim b(efl * 2 - 1)
                        get #freeno, , b
                        en = b
                        en = trim$(replace$(en, vbnullchar, ""))
                        if dv.type = 2 then
                            if instr(1, en, ",") > 0 then
                                a = split(en, ",")
                                if instr(1, a(0), "kbps", vbtextcompare) > 0 then
                                    .bits = val(a(0)) & "kbps"
                                end if
                                if instr(1, a(1), "khz", vbtextcompare) > 0 then
                                    .sample = val(a(1)) & "khz"
                                end if
                            end if
                        elseif dv.type = 1 then '這里可以取到視頻格式信息,因為自己沒這個目的,就沒寫了
                            .musictype = .musictype or mcivideo
                        end if
                        get #freeno, , efl
                        redim b(efl - 1)
                        get #freeno, , b
                    next
                case asf_content_description_object
                    get #freeno, , fd
                    redim b(fd.titlelength - 1)
                    get #freeno, , b
                    en = b
                    en = trim$(replace$(en, vbnullchar, ""))
                    .title = en
                    redim b(fd.authorlength - 1)
                    get #freeno, , b
                    en = b
                    en = trim$(replace$(en, vbnullchar, ""))
                    .artist = en
                    if val(.year) < 1900 or val(.year) > 2100 then
                        redim b(fd.copyrightlength - 1)
                        get #freeno, , b
                        en = b
                        en = trim$(replace$(en, vbnullchar, ""))
                        a = split(en, " ")
                        for i = 0 to ubound(a)
                            if val(a(i)) > 0 then
                                .year = val(a(i))
                                exit for
                            end if
                        next
                    end if
                case asf_extended_content_description_object
                    get #freeno, , k
                    for j = 1 to k
                        get #freeno, , efl
                        redim b(efl - 1)
                        get #freeno, , b
                        en = b
                        en = lcase$(trim$(replace$(en, vbnullchar, "")))
                        get #freeno, , dv
                        select case dv.type
                            case 0, 1
                                redim b(dv.length - 1)
                                get #freeno, , b
                                vl = b
                                vl = trim$(replace$(vl, vbnullchar, ""))
                                select case en
                                    case "title"
                                        .title = vl
                                    case "author"
                                        if .artist = "" then .artist = vl
                                    case "wm/albumartist"
                                        .artist = vl
                                    case "wm/writer"
                                        .writer = vl
                                    case "wm/composer"
                                        .composer = vl
                                    case "wm/albumtitle"
                                        .album = vl
                                    case "wm/lyrics"
                                        .lyrics = replace$(vl, "  ", " ")
                                    case "wm/originalreleaseyear"
                                        if .year = "" then .year = val(vl)
                                    case "wm/year"
                                        .year = val(vl)
                                end select
                            case 2, 3
                                redim b(3)
                                get #freeno, , b
                            case 4
                                redim b(7)
                                get #freeno, , b
                            case 5
                                redim b(1)
                                get #freeno, , b
                        end select
                    next
            end select
            pos = pos + bo.size(0)
        next
    end with
    udtinfo = tmpinfo
    getasfinfo = true
fail:
    close #freeno
end function

private sub command1_click()
    dim i as long, inf as musicinfo, s as string
    inf.filename = text1.text
    if getmusicinfo(inf) then
        s = "文件:" & inf.filename & vbcrlf
        s = s & "歌名:" & inf.title & vbcrlf
        s = s & "唱片:" & inf.album & vbcrlf
        s = s & "歌手:" & inf.artist & vbcrlf
        s = s & "作詞:" & inf.writer & vbcrlf
        s = s & "作曲:" & inf.composer & vbcrlf
        s = s & "年代:" & inf.year & vbcrlf
        s = s & "采樣:" & inf.bits & vbcrlf
        s = s & "位率:" & inf.sample & vbcrlf
        s = s & "歌詞:" & inf.lyrics
    else
        s = "無法取音樂信息"
    end if
    msgbox s
end sub

這是一個與上篇相聯系的代碼,對于一些沒定義的函數,可在前面的文章中找到
http://blog.csdn.net/homezj/archive/2005/04/15/349005.aspx

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沧州市| 广河县| 札达县| 和政县| 勃利县| 河东区| 读书| 福建省| 天祝| 繁昌县| 沧州市| 轮台县| 宝坻区| 大化| 渭南市| 筠连县| 南靖县| 绍兴县| 滦南县| 墨脱县| 军事| 汶上县| 正定县| 微博| 阿鲁科尔沁旗| 金昌市| 建湖县| 公安县| 休宁县| 新泰市| 多伦县| 拜泉县| 四子王旗| 科尔| 乐安县| 香河县| 旅游| 洛浦县| 湄潭县| 贞丰县| 韶关市|