• 2016-03-10

    AVFoundation音频格式在录音过程中变动

    Views: 3613 | No Comments

    Mac 在录音过程中, 在下面的方法中处理音频数据:

    - (void)captureOutput:(AVCaptureOutput *)captureOutput
            didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
            fromConnection:(AVCaptureConnection *)connection
    

    不过, 音频的采样率, 位深, 声道数有可能经常变动. 要注意!

    可以这样设置:

    NSDictionary *settings = @{
                               AVFormatIDKey: @(kAudioFormatLinearPCM),
                               AVLinearPCMBitDepthKey: @(16),
                               AVLinearPCMIsFloatKey : @(NO),
                               // AVSampleRateKey: @(44100), // not for MAC
                               };
    _audioDataOutput.audioSettings = settings;
    

    仅对 Mac 有效, iOS 不能用.

    Posted by ideawu at 2016-03-10 15:21:54
  • 2016-03-08

    Xcode 如何让 Objective C 项目链接 C++ 静态库

    Views: 9694 | 1 Comment

    如果你的 OC 项目引入了一个 C++ 静态库, 那么编译时会提示找不到 vtable 之类的的错误, 因为 OC 是 C 语言, 无法识别 C++ 的静态库, 解决方法是让 Xcode 认为你在使用 C++/Objective-C++, 假装也行.

    所以解决方法是:

    • 往项目里添加一个.cpp文件, 文件是空的.
    • 将 main.m 改名为 main.mm
    Posted by ideawu at 2016-03-08 18:50:50
  • 2016-03-03

    Objective-C 单引号中包含4个字符

    Views: 3534 | 4 Comments

    C语言里, 单引号只能包含1个字符. 但是, 在 Objective-C, 可以包含4个字符, 因为它是一个包含4个字节的32位整数. 这是什么语法特性? 找了半天没找到名字.

    === edit ===

    根据评论中的朋友的提醒, 这种东西叫 "integer character constant", "FourCC", 在 ANSI-C89 已经有.

    Posted by ideawu at 2016-03-03 20:57:27
  • 2016-03-01

    修改Xcode项目编译输出路径

    Views: 5251 | No Comments

    从菜单选取 File - Project - Settings.

    然后只修改 Advanced...

    选中 Legacy 那一项.

    Posted by ideawu at 2016-03-01 13:18:06 Tags:
  • 2016-02-29

    Xcode 设置iOS 9 允许HTTP请求

    Views: 5746 | No Comments

    在 Info.plist 中添加 NSAppTransportSecurity 类型 Dictionary.

    在NSAppTransportSecurity 下添加 NSAllowsArbitraryLoads 类型 Boolean, 值设为 YES.

    Posted by ideawu at 2016-02-29 18:22:32
  • 2016-02-25

    PHP 用 curl 读取 HTTP chunked 数据

    Views: 9358 | No Comments

    对于 Web 服务器返回的 HTTP chunked 数据, 我们可能希望在每一个 chunk 返回时得到回调, 而不是所有的响应返回后再回调. 例如, 当服务器是 icomet 的时候.

    在 PHP 中使用 curl 代码如下:

    <?php  
    $url = "http://127.0.0.1:8100/stream";
    
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'myfunc');
    $result = curl_exec($ch);
    curl_close($ch);
    
    function myfunc($ch, $data){
        $bytes = strlen($data);
        // 处理 data
        return $bytes;
    }
    

    但是, 这里有一个问题. 对于一个 chunk, 回调函数可能会被调用多次, 每一次大概是 16k 的数据. 这显然不是我们希望得到的. 因为 icomet 的一个 chunk 是以 "\n" 结尾, 所以回调函数可以做一下缓冲.

    function myfunc($ch, $data){
        $bytes = strlen($data);
        static $buf = '';
        $buf .= $data;
        while(1){
            $pos = strpos($buf, "\n");
            if($pos === false){
                break;
            }
            $data = substr($buf, 0, $pos+1);
            $buf = substr($buf, $pos+1);
    
            // 处理 data
        }
    }
    
    Posted by ideawu at 2016-02-25 16:44:11
|<<<34567891011>>>| 7/121 Pages, 723 Results.