起名Atititi.名字 姓名 name 起名naming spec 的重组组织正式v2 qc2.docx

PS:博主开了天涯论坛了~详情猛戳:http://weibo.com/SandCu

 

wp系统中默认的付出的是WAV格式的点子,当然无论是用来囤积依然与网络互动都呈现过大了,然而在p7中只可以是用c#展开处理,所以平日会将其保存为Amr格式比如QQ又或者是使用Speex进行编码然后打包成OGG,

Atititi.名字 姓名 name 起名naming spec 的组成社团正式v2 qc2.docx

鉴于Wp8中开放了Native
Code,所以大家能够设想性价比更高的格式如AAC或者MP3格式。

 

1.使用AAC格式

1.1.
职业名 官职等 amir 阿米尔 放前面1

wp8在winPRT中新加盟了AudioVideoCaptureDevice类,通过这一个类我们得以录制音频或者录像,可是因为是在prt中而不是。net类库,所以在应用的时候恐怕会稍稍限制。

1.2.
本名1

首先大家来探望录音的运用格局。

1.3.
父名,祖名,一直可以上溯到亚当(Adam)1

第一在构造函数中来先河化AudioVideoCaptureDevice类的有的装置,当然开首化的机遇需要基于不同的施用场景来区分,那里暂时写在页面的构造函数里

1.4.
家门名,姓(即 family name ,姓,小家族名)1

  private AudioVideoCaptureDevice AVCaptureDevice;
  private IRandomAccessStream Iras;
 private string path;
  public MainPage()
  {
    InitializeComponent();
    init();
  }
  private async void init()
  {
      AVCaptureDevice= await AudioVideoCaptureDevice.OpenForAudioOnlyAsync();
      AVCaptureDevice.AudioEncodingFormat = CameraCaptureAudioFormat.Aac;  
  }    

CameraCaptureAudioFormat是一个枚举值,有Aac,Amr,None,Pcm四种格式,当然不可能有Mp3,毕竟是收费格式~
下面我们来看录音函数:
我们需要使用AudioVideoCaptureDevice的的IAsyncAction StartRecordingToStreamAsync(IRandomAccessStream stream)方法,毕竟是PRT的类,所以使用IRandomAccessStream来做参数也无可厚非,WP8中各种流之间的转换是一个比较让人反胃的东西,不过习惯了就好了,下面我们来看一下录音的Record函数:

 private async void Record(string fileName="sandcu")
        {
                StorageFile storageFile=null;
                StorageFolder localFolder = ApplicationData.Current.LocalFolder;
                IsolatedStorageFile isStore = IsolatedStorageFile.GetUserStoreForApplication();
                if (isStore.FileExists(localFolder.Path + "\\"+fileName+".aac"))
                {
                    storageFile = await localFolder.GetFileAsync(fileName+".aac");
                }
                storageFile = storageFile ?? await localFolder.CreateFileAsync(fileName+".aac", CreationCollisionOption.ReplaceExisting);
                path = storageFile.Path;
                if (storageFile != null)
                {
                    Iras= await storageFile.OpenAsync(FileAccessMode.ReadWrite);
                    await AVCaptureDevice.StartRecordingToStreamAsync(Iras);
                }
        }

1.5.
中华民族名,部落名,村名 (大家族名)1

由于StorageFile
的OpenAsync方法可以很方便的归来一个IRandomAccessStream流所以我们姑且在根目录下创办这样一个临时文件存储流,这样录音之后转存的Aac文件流会直接写入文件中。

1.6.
名号最终面:比如阿克巴2

跟着是终止录音的章程StopRecord。很简短~截至,然后释放流。

1.7.
地方名2

 private async void StopRecord()
        {
            await AVCaptureDevice.StopRecordingAsync();
            Iras.AsStream().Dispose();
        }

1.7.1.
以动物植物命名,野狗林,老树沟2

不世之功告成~

1.7.2.
以开拓者家族命名,孙家沟2

为了测试我们是不是成功的录音了,可以播放一下探访:

1.7.3.
形容词,长江 黄河,2

private void Play()
{ 
    new MediaPlayerLauncher()
            {
                Media = new Uri(path, UriKind.Relative),
            }.Show();
}

1.8.
家谱名(我们族确定辈份用的)2

 假若程序截至后不需要AudioVideoCaptureDevice了 记得Dispose掉;

2.
任何事项2

 2.使用AMR格式

2.1.
简称规范 Amir 本名 称号2

把init中的AVCaptureDevice.AudioEncodingFormat

CameraCaptureAudioFormat.Aac;  改为 AVCaptureDevice.AudioEncodingFormat
= CameraCaptureAudioFormat.Amr;就好……

3.使用MP3格式

其一会相比较勤奋,目前利用最广的MP3编码器当然是Lame~详见 http://lame.sourceforge.net/download.php,打不开的自觉FQ,不过在wp8上使用lame略微有点麻烦,而且比较容易出错。

在wp8中使用native库有几种办法,一是行使dll二是拔取lib,可是我们不可以直接在c#中行使库,所以需要用C++/CX包一层,至于怎么包这一层网上有好多主意,详情请google一下,在此地我们拔取Lib的静态方式来调用Lame。

先是下载lame的源代码,然后找到他的vc_solution文件夹,这里我们需要的是vc9_lame.sln这多少个解决方案,而结尾对我们有用的是libmp3lame-static和libmpghip-static那多少个工程,其他可以先remove掉,然后直接编译就好,这里需要留意的是倘使您使用模拟器调试,那么实际上需要的是win32的lib,而只要您采用真机调试,那么需要的则是Arm的lib,那也就是问怎么一样的工程在模拟器下可用而在真机时则崩溃。

编译,然后我们得到libmpghip-static.lib和libmp4lame-static.lib六个库,然后将他们引入大家团结一心的wp8
project中。记得Include进来lame.h

在不同的Platform下都要安装,比如Arm的即将引用Arm的文本夹,win32的则用win32的lib

随后我们需要树立一个windows phone
组件来包装lib,起名就叫audio好了,下边就是audio工程安装的大体属性

起名 1

设定完lib所在的路径后则记得在链接中进入库的引用,同样也要有别于平台

起名 2

准备干活做完后建立五个filter一个是include一个是source,当然不创建也未曾另外问题

接下来大家树立五个类,一个是包裹类叫做LameWrapper,另一个是CompressedMp3Content用作再次来到值,这六个类都是C++/CX的类,并且要被C#动用,所以注意这多个类必须是Public
ref class并且是sealed的还要不可能有public的析构函数,烦啊~~~

大家来看LameWrapper.h的概念

public ref class LameWrapper sealed
    {
    public:
        LameWrapper();
        IAsyncOperation<CompressedMp3Content^>^ EncodePcm2Mp3(IBuffer^ inPcm, int sampleRate, int channels);
    };

然后是用作再次回到值的CompressedMp3Content类的概念

public ref class CompressedMp3Content sealed
    {
    public:
        CompressedMp3Content(void);
        property Platform::Array<unsigned char>^ Mp3Data;
    };

接下去是压缩MP3的关键性~LameWrapper.CPP

首先Include “Lame.h”

然后来看一下EncodePcm2Mp3方法:

Windows::Foundation::IAsyncOperation<CompressedMp3Content^>^ LameWrapper::EncodePcm2Mp3(IBuffer^ inPcm, int sampleRate, int channels)
{
    lame_global_flags* lame = lame_init();
    lame_set_in_samplerate(lame, sampleRate);
    lame_set_num_channels(lame, channels);
    lame_set_quality(lame, 5);
    lame_init_params(lame);
    IUnknown* pUnk = reinterpret_cast<IUnknown*>(inPcm);
    IBufferByteAccess* pAccess = NULL;
    byte* bytes = NULL;
    HRESULT hr = pUnk->QueryInterface(__uuidof(IBufferByteAccess), (void**)&pAccess);
    if (SUCCEEDED(hr))
    {
        hr = pAccess->Buffer(&bytes);
        if (SUCCEEDED(hr))
        {
            return Concurrency::create_async([=]()->CompressedMp3Content^
            {
                CompressedMp3Content^ result = ref new CompressedMp3Content();
                int pcmLength = inPcm->Length;

                ///TODO:此处直接获取了pcmLength的一半,在pcmLength为奇数的时候会丢掉最后一个字节~不过无所谓了......
                std::vector<short> inBuffer = std::vector<short>(pcmLength / 2);

                for (std::vector<short>::size_type i=0; i<inBuffer.size(); i++)
                {
                    inBuffer[i] = (((short)bytes[i*2+1]) << 8) + bytes[i*2];
                }

                std::vector<byte> outBuffer(inPcm->Length);
                int size = lame_encode_buffer(lame, inBuffer.data(), inBuffer.data(), inBuffer.size(), outBuffer.data(), 0);
                if (size > 0)
                {
                    result->Mp3Data = ref new Platform::Array<unsigned char>(size);

                    for(int i=0; i<size; i++)
                    {
                        (result->Mp3Data)->get(i) = outBuffer[i];
                    }
                }

                lame_close(lame);
                pAccess->Release();
                return result;
            });
        }
        else
        {
            lame_close(lame);
            pAccess->Release();
            throw ref new Platform::Exception(hr, L"Couldn't get bytes from the buffer");
        }
    }
    else
    {
        lame_close(lame);
        throw ref new Platform::Exception(hr, L"Couldn't access the buffer");
    }
}

先安装所需参数,通常大家录下来唯有一个声道了,所以channels给个1好了,当然左右声道都给同一个PCM
buffer就改为双声道了也得以,lame_set_quality时有0~9个级次的质地可选,取中就好,设的太高压缩会很慢,接下去先导process传进来的buffer,为了方便我们给进入的是byte数组,而lame要的是short数组,所以大家要先将byte*转换为short*改换完成未来直接调用lame_encode_buffer来开展更换吧,转换完成后会重回实际的字节数,然后我们将转好的byte*放入CompressedMp3Content类中以供c#进展更进一步处理,然后记得release
all~

回到c#这旁边,当然要引用我们的audio工程,在C#那旁边大家先要拿到pcm流,不晓得为何使用从前涉嫌的AudioVideoCaptureDevice录制PCM会崩溃,所以我们仍旧利用传统的xna下的Microphone来录制pcm流,

录制完成后就很粗略了new出一个LameWrapper后一贯调用EncodePCM2Mp3就好了~

LameWrapper lame = new LameWrapper();
CompressedMp3Content item = await lame.EncodePcm2Mp3(buffer, MicrophoneWrapper.Instance.SampleRate, 1);

 附件1:录制AAC的http://files.cnblogs.com/bader/RecordAAC.rar

附件2:录制MP3的,稍后再传……

功勋卓著告成~呼~

 

PS:博主开了今日头条了~详情猛戳:http://weibo.com/SandCu

 

 

 

 

2.2.
常用的电话机名字规范,本名,职业名 称号 地点名2

2.3.
排列顺序2

2.4.
称号间隔,直系拔取bin,其他使用al,也足以绝不al
和bin 貌似 3

2.5.
姓,氏,别名,外号,字,号3

2.6.
范例3

 

1.1. 职业名 官职  amir 阿米尔 放前面

 

1.2. 本名

1.3. 父名,祖名,一直可以上溯到Adam

1.4. 家族名,姓(即 family name ,姓,小家族名)

1.5. 中华民族名,部落名,姓,村名 (我们族名,许多姓也是群体名)

 

 

1.6. 名称最终面:比如阿克巴

1.7. 地方名

1.7.1. 以动物植物命名,野狗林,老树沟

1.7.2. 以开拓者家族命名,孙家沟

1.7.3. 形容词,长江 黄河,

1.8. 家谱名(我们族确定辈份用的)

 

2. 其它事项

 

2.1. 简称规范 Amir 本名 称号

 

 

2.2. 常用的电话名字规范,本名,职业名 称号 地方名

2.3. 排列顺序

 

相似的话,前多少个是其姓名,最后写的是其家门或者谥号或者笔名

 

其中hajib是喀喇汗大汗为表扬其在理学方面的素养而赐的谥号,在另一对艺术学随笔中则名为他为
yusuf has hajib balasaguni
最后这多少个词是中亚名城巴拉沙衮,申明其家乡的同时也是其笔名

理所当然也有同时在名字中标明谥号和家乡的,可以随心所欲组合。

 

2.4. 名称间隔,直系采纳bin,其他应用al,也得以绝不al 和bin 貌似

2.5. 姓,氏,别名,外号,字,号

 

2.6. 范例

笔者:: 绰号:老哇的爪子claw of
Eagle 偶像破坏者Iconoclast image-smasher

捕鸟王”Bird Catcher 王中之王King of Kings 虔诚者Pious 宗教信仰捍卫者 Defender of the Faith. 卡拉卡拉红斗篷 Caracalla red
cloak

简称:: Emir
Attilax Akbar 埃Mill 阿提拉克斯 阿克巴

全名::Emir
Attilax Akbar bin
Mahmud bin  attila
bin Solomon Al Rapanui 

埃Mill 阿提拉克斯 阿克巴 本 马哈茂德 本 阿提拉 本 所罗门(Solomon)  阿尔 拉帕努伊   

常用名:艾提拉(艾龙),   EMAIL:1466519819@qq.com

转载请表明来源:attilax的专栏   http://www.cnblogs.com/attilax/

–Atiend

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图