Bug勘误

Bug勘误

欢迎大家在这个页面下面把书中的错误指出来,我会及时回复,谢谢。

  • 李泉提出的第一个勘误

原始稿子中第二个峰值左边的340Hz是对的,但是在Kindle版本中这里成为140Hz,应该是扫描问题。无论纸质版还是Kindle版本都出现了这个问题。

  • 王国腾提出的第二个勘误

8.3.4小结的MIDI格式应该放到8.2小节中,毕竟MIDI不属于基础乐理部分,而应该属于数字音频处理部分。

  • stephen.ben.li@163.com提出的问题

3.3.5节中的第一段第一句写到”…,即面向对象与面向结构“,这里的面向结构说的是不准确的,改为面向过程是更准确的。

  • 尹一博提出的问题

239页-也就是对输入信号不做任何改变,即压缩比为1:1

338页-如果是关键帧,就先判断isFirstFrameIDR变量是否为true,如果是true

49 评论

  1. Hi,

    正在阅读纸质书,发现了一些问题,可以讨论一下。
    书的第 28 页 2.3.2 节 iOS 平台交叉编译的实践 里, 按照我的理解, Valid architectures 选项是指当前编译器能够支持的架构,而不是即将编译的指令集。即将编译的指令集是由 Architectures 参数来指定的,目前的值是 ARCHS_STANDARD,我记得至少从 Xcode8 开始,这个标准架构就只包含 armv7 和 arm64 了。用目前最新的 Xcode 9 新建的项目,全部默认的编译环境,Release 下编译出来的 App 可执行二进制文件只会包含 armv7 和 arm64 这两个指令集。

    很喜欢这本书,祝好~~

    1. 你的理解应该是正确的,Valid architectures应该是这个App能够支持的架构但是如果我们使用到的静态库却不支持这个架构的话就有可能有问题,而在书中我想表明的是:如果我们在xCode中的Valid architectures有armv7则代表我们想要我们的App支持armv7,一旦静态库不支持armv7就有可能有错误。
      如果为你带来了困扰,不好意思。

  2. 第八章第一页:“其中Audacity在我们的资源目录中提供了一个。。。。“这一句不通顺,主语是?资源目录在哪?

    1. Hi karl
      原文我是这么写的【在开始本节之前建议读者先下载一个音频编辑工具(如:Audacity、Audition、Cubase等),Audacity在我们的资源目录中提供了一个Mac版本的安装文件】。
      的确不通顺,谢谢你的勘误,应该改为【其中Mac版本的Audacity安装文件在资源目录中已经提供出来】。
      资源目录中的源码部分放在github上了,但是安装文件以及编译脚本还没有放上去,下周我会放上去的,谢谢。

  3. 您好:
    我购买了您的书籍,写的很详细,非常不错。我刚看到第二章,里面有一个关于对lame的交叉编译,我尝试写了下脚本,执行完之后报这样的错误:
    configure: error: expected an absolute directory name for –prefix: ./thin/armv7
    make: *** No rule to make target `clean’. Stop.
    make: *** No targets specified and no makefile found. Stop.
    make: Nothing to be done for `install’.

    不知道是哪里的问题。

  4. 您好,首先非常感谢您能够出这部书,关于移动端音视频开发的资料实在很匮乏,这本书写的非常详细,对我的帮助很大。

    目前我已经在使用最新的Android Studio 3.0.1进行开发,目前构建原生代码的方式是cmake。 我对cmake不是很熟悉,在将您代码仓库中的示例代码迁移到cmake时遇到了问题,让我很困惑。如果您能提供一个迁移使用cmake构建的示例,会对我们这些不太熟悉cmake构建系统的读者起到很大的帮助!~~

    1. 不好意思,实在是没时间去全部转成cmake的脚本,其实代码仓库中都是Android.mk这种原始的构建方式,你可以先从简单的实例来,慢慢一步步迁移的cmakeList中,如果迁移了,可以贡献出来让大家都受益。如果我有时间,我也可以来做这件事,不过最近实在是没时间。

      1. 理解理解,,我自己也尝试过,可能是因为对cmake不太熟悉,查阅了很多资料之后,使用您代码仓库中编译好的ffmpeg静态库,编译时还是会出现“undefined reference xxx”这种错误,函数链接不上。如果改用动态库就没问题。
        您如果能提供一个示范的话,我愿意帮忙将您代码仓库中的其他代码都做一个迁移

  5. 很幸运阅读这本书。在6.0、7.0上运行Android-CameraPreviewRecorder-master的apk,设置为硬件编码或者软件编码,点击encode,直接退回mainactivity,这是什么原因?对平台版本有要求吗?日志如下02-12 14:11:03.836 579-28642/? I/[HWCamera]?HwCamera3EmuiMisc: E
    02-12 14:11:03.843 28560-28601/? I/HWEncoderAdapter: width is 360 640
    02-12 14:11:03.855 594-13192/? I/OMX-VENC: get_config (dataspace changed): ColorSpace: Recommend 601-limited for RGBA8888
    02-12 14:11:03.860 594-28688/? I/OMX-VENC: open Color conv forW: 360, H: 640
    02-12 14:11:03.861 28560-28692/? I/MediaCodecSurfaceEncoder: no output available yet
    02-12 14:11:03.882 649-28651/? E/mm-camera: 8398: iface_util_hw_notify_sof: iface_util_hw_notify_sof SOF event frame_id 200 , sof_frame_id 199
    02-12 14:11:03.882 649-28651/? E/mm-camera: 8398: iface_util_hw_notify_sof: iface_util_hw_notify_sof SOF event frame_id 200 , sof_frame_id 200
    02-12 14:11:03.883 649-28626/? I/mm-camera: 1008: mct_controller_handle_SOF_proc: mct_stream_send_ctrl_sof frameid=200
    02-12 14:11:03.883 649-28626/? E/mm-camera: 537: sensor_fc_process: [process 200] SENSOR_FRAME_CTRL_CALCULATE_EXP_START_TIMESTAMP
    02-12 14:11:03.883 649-28626/? E/mm-camera: 765: sensor_fc_report_meta: cur_sof 200 apply_frame_id 202 led_apply_frame_id 201
    02-12 14:11:03.885 579-28642/? I/[HWCamera]?HwCamera3EmuiMisc: E
    02-12 14:11:03.920 649-28613/? I/mm-camera: 686: sensor_event_cb_sensor_data: Received Light Sensor Data!
    02-12 14:11:03.932 649-28651/? E/mm-camera: 8398: iface_util_hw_notify_sof: iface_util_hw_notify_sof SOF event frame_id 201 , sof_frame_id 200
    02-12 14:11:03.932 649-28651/? E/mm-camera: 8398: iface_util_hw_notify_sof: iface_util_hw_notify_sof SOF event frame_id 201 , sof_frame_id 201
    02-12 14:11:03.933 649-28626/? I/mm-camera: 1008: mct_controller_handle_SOF_proc: mct_stream_send_ctrl_sof frameid=201
    02-12 14:11:03.933 649-28626/? E/mm-camera: 537: sensor_fc_process: [process 201] SENSOR_FRAME_CTRL_CALCULATE_EXP_START_TIMESTAMP
    02-12 14:11:03.933 649-28626/? E/mm-camera: 765: sensor_fc_report_meta: cur_sof 201 apply_frame_id 203 led_apply_frame_id 202
    02-12 14:11:03.937 579-28642/? I/[HWCamera]?HwCamera3EmuiMisc: E
    02-12 14:11:03.944 28560-28692/? I/MediaCodecSurfaceEncoder: why mBufferInfo.size is equals 0
    02-12 14:11:03.945 28560-28692/? I/HWEncoderAdapter: SPS PPS…
    02-12 14:11:03.982 649-28651/? E/mm-camera: 8398: iface_util_hw_notify_sof: iface_util_hw_notify_sof SOF event frame_id 202 , sof_frame_id 201
    02-12 14:11:03.982 649-28651/? E/mm-camera: 8398: iface_util_hw_notify_sof: iface_util_hw_notify_sof SOF event frame_id 202 , sof_frame_id 202
    02-12 14:11:03.984 649-28626/? I/mm-camera: 1008: mct_controller_handle_SOF_proc: mct_stream_send_ctrl_sof frameid=202
    02-12 14:11:03.984 649-28626/? E/mm-camera: 537: sensor_fc_process: [process 202] SENSOR_FRAME_CTRL_CALCULATE_EXP_START_TIMESTAMP
    02-12 14:11:03.984 649-28626/? E/mm-camera: 765: sensor_fc_report_meta: cur_sof 202 apply_frame_id 204 led_apply_frame_id 203
    02-12 14:11:03.986 579-28642/? I/[HWCamera]?HwCamera3EmuiMisc: E

    ——— beginning of crash
    02-12 14:11:03.994 28560-28692/? A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x30 in tid 28692 (Thread-204)

    [ 02-12 14:11:03.995 415: 415 W/ ]
    debuggerd: handling request: pid=28560 uid=10114 gid=10114 tid=28692

  6. 第38页,在Ubuntu中编译FDK-AAC,编译脚本–host应设置为arm-linux,如果为armv7a编译会报错。
    另外sourceforge提供的fdk-aac-0.1.4中没有configure文件。

  7. 拜读了本书,着实不错,现在网络上少有人将移动端的音视频处理讲的如此透彻,从基础理论到项目实践,由浅入深,学到了很多知识,深表感谢!
    现在大部分Android开发者都切换到Android Studio了,所以在这边我也略尽薄力,将部分转换后的工程分享出来,希望能抛砖引玉,能有更多的人看到这本好书,能有更多的人为音视频开发贡献力量!
    https://github.com/ShawnJings/Android-AudioPlayer

  8. 在书的第五页,比特率的计算中 44100*16*2 = 1378.125 Kbps 直接从 b /s换算成 Kb/s (单位换算不直观), 在下面计算CD音质在一分钟内占据存储空间的时候 1378.125 *60/8/1024 = 10.09 MB , 按我的理解一秒钟产生的数据1378.125 Kb 那么一分钟产生数据为1378.125*60( Kb),按照1 MB = 1024 Kb计算 直接除以1024就行了 为什么还要除以8。是我理解错了吗?

  9. P105 第二段落第四行:
    这里的坐标和OpenGL中的纹理坐标正好是做了一个180度的旋转,

    纠正:这里应该是上下翻转(垂直翻转)

  10. 纠正:
    P95:代码片段 // 计算顶点坐标 -> // 计算纹理坐标
    P96: 图4-5, 右下角 Vertex -> Fragment, 中下 Frgment -> Fragment;
    P100:底下代码片段第三行: eglContextAttributes -> attributes;

    疑问:
    P12:最后段落,两个I帧之间形成的一组图片,就是GOP –》这里是否写 IDR帧比较合适。
    P80: 对于mBitsPerChannel,我不知道为什么苹果取这个名字,看了很蒙,应该很像 BitsPerSample的感觉。
    P103: 代码片段中格式设置RGB565,这里是否改成 RGBA8比较好。

    建议:
    P106:最后一段落,建议顺便提下 GL_REPEAT

    1. 首先非常感谢你的勘误。
      疑问一:
      中文都把 I 帧翻译成关键帧了,所有的 IDR 帧都是 I 帧,但是并不是所有 I 帧都是 IDR 帧,IDR 帧是 I 帧的子集。I 帧严格定义是帧内编码帧,由于是一个全帧压缩编码帧,通常用 I 帧表示 “关键帧”。IDR 是基于 I 帧的一个 “扩展”,带了控制逻辑,IDR 图像都是 I 帧图像,当解码器解码到 IDR 图像时,会立即将参考帧队列清空,将已解码的数据全部输出或抛弃。重新查找参数集,开始一个新的序列。这样如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR 图像之后的图像永远不会使用 IDR 之前的图像的数据来解码;
      疑问二:
      苹果可能表示每个升到有多少个bits,其实更容易表示当前的概念,只不过平常我们都不会这么细致的去表达;
      疑问三:
      RGB565是Android平台大家常用于优化Bitmap占用内存的方式,所以使用这个格式更容易使读者进入场景。

      谢谢

  11. 编译lame库那一小节中提供的代码,
    –host=arm-apple-darwin \
    没有有加引号,应该改为
    –host=”arm-apple-darwin” \

    (多看阅读电子书版本)

  12. 第三章 63页:
    AVFormatContext *formatCtx = avformat_allocc_context();
    ……
    avformat_open_input(formatCtx, paht, NULL, NULL);
    ……
    这里可能书写有遗漏, formatCxt类型与avformat_open_input需要参数类型不符, avformat_open_input需要参数类型为二级指针, 而定义类型为一级指针。
    还有一个问题请教咨询:我在测试中avformat_open_input一直失败, 返回错误为-1414092869,我在ffmpeg中也没找的错误码的定义, 在书中也没看的有书写可能出错的原因, 我使用的是mov格式文件。

    1. 应该是mov这个容器没有打开demuxer选项吧,可以使用https://github.com/zhanxiaokai/Android-as_video_player 这个仓库地址试一下。
      另外把你的mov文件转成flv或者mp4试一下

  13. 作者你好,我仔细阅读了您的书。并且参考 这个 https://github.com/ShawnJings/Android-AudioPlayer 仓库移植项目到AndroidStudio 但是发生了 如下错误
    A/libc: Fatal signal 4 (SIGILL), code 1, fault addr 0xef0d63c4 in tid 6244 (droidmp3encoder)
    所有代码都是从eclipse项目移植过去的 但是好像是c代码出现了问题
    如果您有时间,请帮我看下这个问题 下面是我的项目地址
    https://github.com/HuRuWo/AndroidMP3Encoder

  14. 你好,我从github上面git的Android-as_video_player这个项目,seekBar滑动没有用,请看看什么原因。谢谢

  15. 你好,跟着书上的sh文件,使用mac os编译,出现一下错误:
    configure: WARNING: you should use –build, –host, –target
    configure: WARNING: invalid host type: /Users/linwj/lame-3.99.5/armv7a
    checking build system type… Invalid configuration `/Users/linwj/lame-3.99.5/armv7a’: machine `/Users/linwj/lame’ not recognized
    configure: error: /bin/sh ./config.sub /Users/linwj/lame-3.99.5/armv7a failed
    make: *** No rule to make target `clean’. Stop.
    make: *** No targets specified and no makefile found. Stop.
    make: Nothing to be done for `install’.
    请问这是什么原因呢?请帮帮忙

  16. 第五页关与kbps 转换的问题。
    44100 * 16 * 2 = 1411200bit
    转换成bps单位的话应该是除以1000吧。
    1411200/1000 = 1411.2kbps。
    或者我理解的有问题,望您指正.

  17. 第九页
    1.5.2 YUV 表示方式 第二段
    第四行
    Y、U、V 都是用8个字节来表示 。
    我是刚学的,都不懂,所以看的很细致,我也不知道我看的对不对。 我觉得应该是8个bit 一个字节表示。

    1. 你的理解是对的,应该是我的笔误,如果对你造成了困扰,说句抱歉,下个版本我会更正。

  18. 你好:
    第28页关与指令集的内容。
    最后一句,“因为Valid architectures 对应的指令集是armv7 armv7s armv64 ,在Release 下会为各个指令集便已对应的代码,因此最后的ipa体积基本上翻了3倍”。
    我的理解是: XCode生成二进制包所支持的指令集 是 Architectures 和Valid architectures 在Release 的时候 交集。
    如果Architectures 使用的是standard(armv7 armv64), Valid architectures (armv7 armv7s armv64 ) 那么最终编译的只有armv7 armv64 体积翻倍而不应该是3倍。应该同时指定 Architectures 和 Valid architectures 。确定交集确认编译的指令集。
    我个人理解,不正确之处多谢指点。

发表评论

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