WMA文件信息格式分析及代码

WMA文件信息格式分析及代码 收藏
ASF文件和WMA文件格式差不多。具体请看下面我写的代码。文件分析根据mplayer其中的asfhead.c提供的代码进行分析。mplayer只解除出了标准的wma头信息,其扩展信息并没有解析出来。代码如下.


/*
每一个WMA文件,它的头16个字节是固定的,为十六进制的“30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C”,用来标识这个是否为WMA文件。接下来的8个字节为一个整数,表示整个WMA文件头部的大小,这个头部里面包含了Tag信息等所有非音频信息,头部后面的是音频信息,我们在这里就不深入了解了。那个整数接下来的6个字节还没搞清楚是什么用的,不过不影响我们对Tag信息的读写。

       也就是说从文件开始偏移量为31开始,里面存放了很多帧,有我们需要的标准Tag信息,扩展Tag信息,WMA文件控制信息等等。每个帧不是等长的,但是帧头是固定的24个字节,其中前16字节是用来标识这个帧的名字,后8个字节是用来表示这个帧(包括帧头)的大小。这一点和MP3文件的ID3V2信息比较像。

        由于我们只需要读写Tag信息,而Tag信息又分别保存在两个帧里,分别为标准Tag帧和扩展Tag帧,所有我们只需要处理这两个帧,其他帧完全可以根据获得的帧长度来跳过。

       如图2,标准Tag帧只包含歌曲标题,艺术家,版权,备注四个内容。它的帧名是十六进制的“33 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C”,在24个字节的帧头后紧跟着5个分别为2个字节的整数,前四个分别表示歌曲标题,艺术家,版权,备注的大小,第五个还不清楚是什么用的,大部分情况下是不使用的,即它的大小为0的。

        在这10个字节后,这四个信息的内容就按顺序存放了。记住,在WMA文件里,所有的文字都是按Unicode宽字符的编码方式储存的,而且每个字符串后面都又一个0结束字符的。

        再看扩展Tag帧,这里就比较麻烦了,里面包含的信息的个数是不确定的,每个信息也是按照像帧一样的方式组织起来的。扩展Tag帧的帧名是十六进制的“40 A4 D0 D2 07 E3 D2 11 97 F0 00 A0 C9 5E A8 50”,在24字节的帧头后先有一个两个字节的整数表示这个帧里一共有的扩展信息个数(ExNo)。

        每一个扩展信息包含扩展信息名字和对应的值。先有一个两个字节的整数来表示扩展名字信息的大小,接着是扩展信息,然后有一个两个字节的整数标志(Flag),这个后面再讲。然后又是一个两个字节的整数,表示值的大小。接着就是这个值。

       当扩展信息名字为WMFSDKVersion时,这个值表示的是这个WMA文件的版本;当扩展信息名字为WM/AlbumTitle时,这个值代表的就是专辑名;当扩展信息名字为WM/Genre时,这个值代表的就是流派;同理,很容易从扩展信息的名字看出这个值的用途的。这些扩展信息的名字和值几乎都是用Unicode的字符串来存储的,到现在为止只发现对下面两个情况例外

       下面再来看看那个标志Flag,这个基本上是为没什么用的(通常值为0),只对WM/TrackNumber和WM/Track这两个扩展信息名字有用,当Flag为3的时候后面的值(也就是曲目信息)是以4个字节的整数的形式表示,当Flag为0的时候,曲目信息是以普通的字符串形式表示的。
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<sys/mman.h>
typedef unsigned long long uint64_t;
typedef unsigned long uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;
typedef long long int64_t;
typedef short int16_t;
typedef struct
{
    uint16_t title_size;
    uint16_t author_size;
    uint16_t copyright_size;
    uint16_t comment_size;
    uint16_t rating_size;
}ASF_content_description_t;
struct asf_tags
{
    char title[64];
    char author[64];
    char copyright[64];
    char comment[64];
    char rating[64];
    char **ext_info;
};

const uint8_t ff_log2_tab[256]={
        0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
        5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
        6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
        6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
};
static inline int av_log2(unsigned int v)
{
    int n;

    n = 0;
    if (v & 0xffff0000) {
        v >>= 16;
        n += 16;
    }
    if (v & 0xff00) {
        v >>= 8;
        n += 8;
    }
    n += ff_log2_tab[v];

    return n;
}
#define PUT_UTF8(val, tmp, PUT_BYTE)/
    {/
        int bytes, shift;/
        uint32_t in = val;/
        if (in < 0x80) {/
            tmp = in;/
            PUT_BYTE/
        } else {/
            bytes = (av_log2(in) + 4) / 5;/
            shift = (bytes - 1) * 6;/
            tmp = (256 - (256 >> bytes)) | (in >> shift);/
            PUT_BYTE/
            while (shift >= 6) {/
                shift -= 6;/
                tmp = 0x80 | ((in >> shift) & 0x3f);/
                PUT_BYTE/
            }/
        }/
    }

const char asf_file_format_guid[16] = {0x30, 0x26, 0xB2, 0x75, 0x8E,
  0x66, 0xCF, 0x11, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C};/*ASF文件标志*/

const char asf_content_desc_guid[16] = {0x33, 0x26, 0xb2, 0x75,
  0x8e, 0x66, 0xcf, 0x11, 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c};/*ASF 标志信息*/

const char asf_stream_ext_desc_guid[16] = {0x40, 0xA4, 0xD0, 0xD2, 0x07,
 0xE3, 0xD2, 0x11, 0x97, 0xF0, 0x00, 0xA0, 0xC9, 0x5E, 0xA8, 0x50};/*ASF扩展标志信息*/

 

#define AV_RL16(x)  ((((uint8_t*)(x))[1] << 8) | /
                      ((uint8_t*)(x))[0])
static char* get_ucs2str(const uint16_t* inbuf, uint16_t inlen)
{
    char* outbuf = calloc(inlen, 2);
    char* q;
    int i;
    if (!outbuf)
    {
        return NULL;
    }
    q = outbuf;
    for (i = 0; i < inlen / 2; i++)
    {
        uint8_t tmp;
        PUT_UTF8(AV_RL16(&inbuf[i]), tmp, *q++ = tmp;)
    }
    return outbuf;
}
int find_asf_guid(char *buf, const char *guid, int cur_pos, int buf_len)
{
  int i;
  for (i = cur_pos; i < buf_len - 19; i++) {
    if (memcmp(&buf[i], guid, 16) == 0)
      return i + 16 + 8; // point after guid + length
  }
  return -1;
}
int asf_ext_info_add(struct asf_tags* tags, const char *opt, const char *param)
{
    char **info = tags->ext_info;
    int n = 0;
    for(n = 0; info && info[2*n] != NULL; n++)
    {
        if(!strcasecmp(opt,info[2*n]))
        {
               free(info[2*n+1]);
            info[2*n+1] = strdup(param);
            return 0;
        }
    }
    info = tags->ext_info = (char**)realloc(info,(2*(n+2))*sizeof(char*));
    info[2*n] = strdup(opt);
    info[2*n+1] = strdup(param);
    memset(&info[2*(n+1)],0,2*sizeof(char*));
    return 1;
}
enum metadata_s
{
    /* common info */
    META_INFO_TITLE=0,
    META_INFO_AUTHOR,
    META_INFO_COPYRIGHT,
    META_INFO_COMMENT,
    META_INFO_WMFSDKVERSION,
    META_INFO_WMFSDKNEEDED,
    META_INFO_ISVBR,
    META_INFO_WMPROMOTIONURL,
    META_INFO_WMGENREID,
    META_INFO_WMTRACK,
    META_INFO_WMTRACENUMBER,
    META_INFO_WMYEAR,
    META_INFO_WMENCODINGTIME,
    META_INFO_WMGENRE,
    META_INFO_WMALBUMTITLE,
    META_INFO_PEAKVALE,
    META_INFO_AVERAGELEVEL
};
typedef enum metadata_s metadata_t;
static char *get_asf_info (struct asf_tags* tags,char *tag)
{
    char **info = tags->ext_info;
    int n;
    if (!info || !tag)
        return NULL;
    for (n = 0; info[2*n] != NULL ; n++)
    {
        if (!strcmp (info[2*n], tag))
            break;
    }
    return info[2*n+1] ? strdup (info[2*n+1]) : NULL;
}
char *get_metadata (struct asf_tags* tags,metadata_t type)
{
    switch (type)
    {
        case META_INFO_TITLE:
        {
            return tags->title;
        }
        case META_INFO_AUTHOR:
          {
            return tags->author;
        }
        case META_INFO_COPYRIGHT:
        {
            return tags->copyright;
        }
        case META_INFO_COMMENT:
        {
            return tags->comment;
        }
        case META_INFO_WMFSDKVERSION:
        {
            return get_asf_info(tags,"WMFSDKVersion");
        }
        case META_INFO_WMFSDKNEEDED:
        {
            return get_asf_info(tags,"WMFSDKNeeded");
        }
        case META_INFO_ISVBR:
        {
            return get_asf_info(tags,"IsVBR");
        }
        case META_INFO_WMPROMOTIONURL:
        {
            return get_asf_info(tags,"WM/PromotionURL");
        }
        case META_INFO_WMGENREID:
        {
            return get_asf_info(tags,"WM/GenreID");
        }
        case META_INFO_WMTRACK:
        {
                return get_asf_info(tags,"WM/Track");
        }
        case META_INFO_WMTRACENUMBER:
        {
                return get_asf_info(tags,"WM/TrackNumber");
        }
        case META_INFO_WMYEAR:
        {
            return get_asf_info(tags,"WM/Year");
        }
        case META_INFO_WMENCODINGTIME:
        {
            return get_asf_info(tags,"WM/EncodingTime");
        }
        case META_INFO_WMGENRE:
        {
            return get_asf_info(tags,"WM/Genre");
        }
        case META_INFO_WMALBUMTITLE:
        {
            return get_asf_info(tags,"WM/AlbumTitle");
        }
        case META_INFO_PEAKVALE:
        {
            return get_asf_info(tags,"PeakValue");
        }
        case META_INFO_AVERAGELEVEL:
        {
            return get_asf_info(tags,"AverageLevel");
        }
    }
}
int read_asf_header(char  *filename,struct asf_tags* tags)
{
    int hdr_len;
    char *hdr = NULL;
    int pos;
    int fd;
    char buffer[16];
    struct stat sb;
    fd=open(filename,O_RDONLY);
    if(fd==-1)
    {
        printf("open file error/n");
        return 0;
    }
    memset(buffer,0,16);
    fstat(fd,&sb); /*取得文件大小*/
    hdr=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);
    if(hdr== MAP_FAILED) /*判断是否映射成功*/
    {
        return 0;
        close(fd);
    }
    strncpy(buffer,hdr,16);
    if(strcmp(buffer,asf_file_format_guid))/*根据ASF标志信息判断是否为ASF文件*/
    {
        printf("file not an asf file/n");
        close(fd);
        munmap(hdr,sb.st_size);
        return 0;
    }
    hdr_len=sb.st_size;
    pos = find_asf_guid(hdr, asf_content_desc_guid, 0, hdr_len);/*找到标志信息位置*/
    if (pos >= 0)
    {
        ASF_content_description_t *contenth = (ASF_content_description_t *)&hdr[pos];
        unsigned char *string=NULL;
        uint16_t* wstring = NULL;
        uint16_t len;
        pos += sizeof(ASF_content_description_t);
        if (pos > hdr_len) goto len_err_out;
        //le2me_ASF_content_description_t(contenth);
        // extract the title
        if((len = contenth->title_size) != 0)
        {
            wstring = (uint16_t*)&hdr[pos];
            pos += len;
            if (pos > hdr_len) goto len_err_out;
            if ((string = get_ucs2str(wstring, len)))/*J解析成UTF8*/
            {
                    strcpy(tags->title, string);
                free(string);
            }
        }
        // extract the author
        if((len = contenth->author_size) != 0)
        {
            wstring = (uint16_t*)&hdr[pos];
            pos += len;
            if (pos > hdr_len) goto len_err_out;
            if ((string = get_ucs2str(wstring, len)))
            {
                strcpy(tags->author, string);
                free(string);
            }
        }
        if((len = contenth->copyright_size) != 0)
        {
            wstring = (uint16_t*)&hdr[pos];
            pos += len;
            if (pos > hdr_len) goto len_err_out;
            if ((string = get_ucs2str(wstring, len)))
            {
                strcpy(tags->copyright, string);
                free(string);
            }
        }
        // extract the comment
        if((len = contenth->comment_size) != 0)
        {
            wstring = (uint16_t*)&hdr[pos];
            pos += len;
            if (pos > hdr_len) goto len_err_out;
            if ((string = get_ucs2str(wstring, len)))
            {
                strcpy(tags->comment, string);
                free(string);
            }
        }
        // extract the rating
        if((len = contenth->rating_size) != 0)
        {
            wstring = (uint16_t*)&hdr[pos];
            pos += len;
            if (pos > hdr_len) goto len_err_out;
            if ((string = get_ucs2str(wstring, len)))
            {
                strcpy(tags->rating, string);
                free(string);
            }
        }
    }
    pos = find_asf_guid(hdr, asf_stream_ext_desc_guid, 0, hdr_len);/*找到扩展信息标志位置*/
    if (pos >= 0)
    {
        int i;
        //unsigned char *ext_desc;
        uint16_t flag;
        uint16_t ext_desc_num;
        unsigned char *string_name=NULL;
        unsigned char *string_info=NULL;
        uint16_t* wstring = NULL;
        uint16_t len;
        ext_desc_num=(*(uint16_t*)(&hdr[pos]));
        //printf("%d/n",ext_desc_num);
        pos += 2;   
        for(i=0;i<ext_desc_num;i++)
        {
            len=(*(uint16_t*)(&hdr[pos]));/*扩展名字信息大小*/
            pos+=2;
            wstring=(uint16_t*)&hdr[pos];
            if ((string_name = get_ucs2str(wstring, len)))
            {
                        //printf(" %d.扩展信息名字 %s/n", i,string_name);
                //free(string_name);
            }
            pos+=len;
            flag=(*(uint16_t*)(&hdr[pos]));/*标志*/
            pos+=2;
            len=(*(uint16_t*)(&hdr[pos]));/*扩展名字对应值大小*/
            pos+=2;
            wstring=(uint16_t*)&hdr[pos];
            if ((string_info = get_ucs2str(wstring, len)))
            {
                        //printf(" 扩展信息对应的值 %s/n",string_info);
                //free(string_info);
            }
            asf_ext_info_add(tags,string_name,string_info);
            pos+=len;
        }
    }
    close(fd);
    munmap(hdr,sb.st_size);
    return 1;
    len_err_out:
    close(fd);
    munmap(hdr,sb.st_size);
    return 0;
}
int main(int argc,char **argv)
{
    char *filename=argv[1];
    int i;
    char **info;
    struct asf_tags tags;
    tags.ext_info=(char**)malloc(2*sizeof(char*));
    read_asf_header(filename,&tags);
    char **ext_info;
    printf("Title:%s/n",tags.title);
    printf("Author:%s/n",tags.author);
    printf("Copyright:%s/n",tags.copyright);
    printf("Comment:%s/n",tags.comment);
    printf("Rating:%s/n",tags.rating);
    info = tags.ext_info;
    for(i = 0; info[2*i] != NULL ; i++)
    {
        printf("%s: %s/n",info[2*i],info[2*i+1]);
    }
    return 0;
}
这里已经做了相关信息的接口,利于扩展开发。希望这些能对那些正在进行相关开发的人员提供一点帮助。本人从事音频视频解码,希望能和大家一起探讨,共通进步。联系方法QQ:263542344

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/benny5609/archive/2008/05/07/2409533.aspx

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yueyihua/archive/2010/04/20/5508286.aspx

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yueyihua/archive/2010/04/20/5508286.aspx

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yueyihua/archive/2010/04/20/5508286.aspx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[No0000101]JavaScript-基础课程1

JavaScript 是一种轻量级的编程语言&#xff0c;很容易学习&#xff0c;同时也是一种被广泛用于客户端Web开发的脚本语言。通过本课程学习&#xff0c;我们可以了解到JavaScript的基本语法知识&#xff0c;以及怎样使用它去创建简单的游戏和应用。 1.获取字符的长度 "youN…

研究人员发现Office Word 0Day攻击 这个漏洞绕过了word宏安全设置 绿盟科技、McAfee及FireEye发出警告...

这次的0Day漏洞确实很厉害&#xff0c;以往攻击者诱使用户点击Word文档&#xff0c;由于其中包含了恶意脚本&#xff0c;大多数需要用户启用了宏。但这次的漏洞不是&#xff0c;受害者无需启用宏&#xff0c;也会中招&#xff0c;而且漏洞覆盖Windows所有版本&#xff08;包括W…

秀米svg点击显示另一张图_SVG的雷,你踩过了没?

原标题&#xff1a;SVG的雷&#xff0c;你踩过了没&#xff1f;随着SVG互动布局的出现和在H5的应用越来越多&#xff0c;不少小伙伴们会想在秀米里上传自己制作的SVG图形。秀米的首页顶部教程收录了一篇关于SVG图形的讲解&#xff1a;「秀米的SVG图片」&#xff0c;里面主要介绍…

关于C10K问题详解-突破单机性能是高性能网络编程

本文转自:https://www.jianshu.com/p/ba7fa25d3590 C10K问题由来 随着互联网的普及&#xff0c;应用的用户群体几何倍增长&#xff0c;此时服务器性能问题就出现。最初的服务器是基于进程/线程模型。新到来一个TCP连接&#xff0c;就需要分配一个进程。假如有C10K&#xff0c;…

数据中心传输需求成以太网市场巨大推动力

近日&#xff0c;市场研究机构Infonetics作出评估称&#xff0c;数据中心以太网市场将迎来全面发展的势头&#xff0c;其驱动力则在于当前数据中心以太网络交换接口由10Gbps产品向25Gbps乃至50Gbps标准的大规模升级。 根据对2014年第三季度的市场销售情况研究&#xff0c;该公司…

Gina DLL

Windows的开机密码认证模块一般是由Gina DLL完成的。在NT/2000中交互式的登陆支持是由WinLogon调用GINA DLL实现的&#xff0c;GINA DLL提供了一个交互式的界面为用户登陆提供认证请求。1.Gina原理WinLogon会和GINA DLL进行交互&#xff0c;缺省是MSGINA.DLL(在System32目录下)…

ultilize什么意思_ultilize是什么意思

1. We also ultilize the supports of NSFC for other valuable researches.我们还利用基金支持&#xff0c;做了其他一些有价值的科研工作。2. Recover the second segment with all due haste, ultilize any means necessary.尽快取回第二部分&#xff0c;使用任何必要的手段…

HTML,CSS的class与id命名规则

个人博客点这里 最重要的部分先说(命名书写格式) 常见的格式有&#xff1a;连接符&#xff08;search-btn&#xff09;、下划线、全小&#xff08;searchbox&#xff09;、小驼峰&#xff08;searchBox&#xff09;。 现在用得多广泛的还是第一种使用连接符&#xff0c;易读…

主打“云安全” 迅雷系帝恩思登陆新三板

ZD至顶网安全频道 06月14日 综合消息&#xff1a; 6月14日上午&#xff0c;帝恩思(837018)敲响了登陆新三板的钟声。作为帝恩思的重要股东&#xff0c;迅雷&#xff08;NASDAQ:XNET&#xff09;CEO邹胜龙与帝恩斯董事长王宇杰、总经理许渊培等人一同参加了这一仪式。 帝恩斯是一…

UESTC 1636 梦后楼台高锁,酒醒帘幕低垂

题意&#xff1a;求一条路径&#xff0c;使得这条边连接1到n&#xff0c;求边权值的最大值与最小值的差 题解&#xff1a;最小生成树&#xff0c;对边权排序&#xff0c;可以枚举边的最大和最小的值&#xff0c;判断能否使得1和n连通 #include <bits/stdc.h> #define ll …

wav文件格式分析详解

wav文件格式分析详解 作者&#xff1a;曹京日期&#xff1a;2006年7月17日 一、综述 WAVE文件作为多媒体中使用的声波文件格式之一&#xff0c;它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写&#xff0c;每个WAVE文件的头四个字节便是“RIFF…

pg数据库开启远程连接_Postgresql开启远程访问的步骤全纪录

前言安装PostgreSQL数据库之后&#xff0c;默认是只接受本地访问连接。如果想在其他主机上访问PostgreSQL数据库服务器&#xff0c;就需要进行相应的配置。下面话不多说了&#xff0c;来一起看看详细的介绍吧。步骤如下&#xff1a;要在Postgresql中允许远程访问,需要设置如下2…

Vue.js前后端分离2

个人博客点这里 内容回顾 - 过滤器 - 局部的过滤器 // 只能在当前组件内部使用 filters:function(val,a,b){// 执行过滤处理逻辑,(添油加醋的内容)return xxx; }- 全局的过滤器 // 声明创建 在任何组件中都能使用 Vue.filter("myTime",function() {// 添油加醋的…

WORD列表缩进的文本起始点

Figure 1 Figure 2 Figure 3 编号位置以刻度尺为起点0.74厘米&#xff08;2个字符间距&#xff09;&#xff0c;文本缩进以刻度尺为起点2.96厘米&#xff08;8个字符间距&#xff09; 以上两者相减得到的值正好特殊格式悬挂缩进的值2.22厘米 Figure 4 上图看到&#xff0c;文本…

无人车火了 百度是如何做到的?

ZD至顶网服务器频道 03月02日 新闻消息&#xff08;文/于泽&#xff09;&#xff1a;百度无人车可谓狠狠的吸足了大众的眼球。一个问题逐渐出现在我们心中&#xff0c;为什么百度这样的互联网企业会推出无人车&#xff0c;似乎搜索引擎和无人车之间的关联度并不是很高。 谜题的…

测绘技术设计规定最新版_测绘技术设计规定

《》是中国测绘出版社出版图书&#xff0c;下面小编给大家介绍关于的相关资料&#xff0c;希望对您有所帮助。《》内容国家测绘地理信息局法规与行业管理司编著的《(2014)》是一本关于测绘资质管理规定和测绘资质分级标准的书。具体内容包括&#xff1a;大地测量专业标准、测绘…

各类音频格式解析

CD格式&#xff1a;天籁之音 当今世界上音质最好的音频格式是什么&#xff1f;当然是CD了。因此要讲音频格式&#xff0c;CD自然是打头阵的先锋。在大多数播放软件的“打开文件类型”中&#xff0c;都可以看到&#xff0a;.cda格式&#xff0c;这就是CD音轨了。标准CD格式也就是…

Error: Java heap space

在chd中 的hive中执行 (select count (*)) 或者mr程序都报Error: Java heap space 4、io.sort.mb 的作用 排序所使用的内存数量。 默认值&#xff1a;100M&#xff0c;需要与mapred.child.java.opts相配 默认&#xff1a;-Xmx200m。 不能超过mapred.child.java.opt设置&…

Golang语言基础课件

go学习pdf课件,大家可以收藏页面以免文件丢失 原文链接:http://victorfengming.gitee.io/course/go/

NIO客户端主要创建过程

NIO客户端主要创建过程:步骤一&#xff1a;打开SocketChannel&#xff0c;绑定客户端本地地址&#xff08;可选&#xff0c;默认系统会随机分配一个可用的本地地址&#xff09;&#xff0c;示例代码如下&#xff1a; SocketChannel clientChannel SocketChannel.open(); 步骤…