我只想获得音频文件中的标记列表.我认为这将是一项不太难的简单的共同任务.但是,我几乎找不到任何示例代码或文档,所以我最终得到了这个:
private func getMarkers(_ url: CFURL) -> AudioFileMarkerList {
var file: AudioFileID?
var size: UInt32 = 0
var markers = AudioFileMarkerList()
AudioFileOpenURL(url, .readPermission, kAudioFileWAVEType, &file)
AudioFileGetPropertyInfo(file!, kAudioFilePropertyMarkerList, &size, nil)
AudioFileGetProperty(file!, kAudioFilePropertyMarkerList, &size, &markers)
return markers
}
Run Code Online (Sandbox Code Playgroud)
可悲的是,这不起作用:error: memory read failed for 0x0.
我只是想不通问题.我检查了网址和大小(两者都有效),但总是无法检索标记.任何帮助都会很棒!
编辑: 这种工作,但所有的数据是完全错误的,我无法理解单个音频文件如何有多个标记的AudioFileMarkerLists:
private func getMarkers(_ url: CFURL) -> [AudioFileMarkerList] {
var file: AudioFileID?
var size: UInt32 = 0
AudioFileOpenURL(url, .readPermission, kAudioFileWAVEType, &file)
AudioFileGetPropertyInfo(file!, kAudioFilePropertyMarkerList, &size, nil)
let length = NumBytesToNumAudioFileMarkers(Int(size))
var markers = [AudioFileMarkerList](repeating: AudioFileMarkerList(), …Run Code Online (Sandbox Code Playgroud) 如果之前有人玩过Agar.io,你可能会熟悉相机移动的方式.它会滑向鼠标,具体取决于鼠标距离屏幕中心的距离.我正在尝试使用SKCameraNode和touchesMoved重新创建此运动:
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let pos = touches.first!.location(in: view)
let center = view!.center
let xDist = pos.x - center.x
let yDist = pos.y - center.y
let distance = sqrt((xDist * xDist) + (yDist * yDist)) * 0.02
camera?.position.x += xDist * distance * 0.02
camera?.position.y -= yDist * distance * 0.02
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,这看起来并不太糟糕.但是,这有两个问题.
首先,我想为此使用UIPanGestureRecognizer,因为它可以通过多次触摸更好地工作.我无法想象如何做到这一点,因为我无法想到一种方法来使用它来获得从触摸到屏幕中心的距离.
第二个问题是这种运动并不顺利.如果用户停止移动他们的手指一帧,那么由于相机拍摄到绝对停止,因此会有巨大的跳跃.我在数学方面很糟糕,所以我想不出一种方法来实现一个很好的平滑衰减(或攻击).
任何帮助都会很棒!
编辑:我现在这样做:
private var difference = CGVector()
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let pos …Run Code Online (Sandbox Code Playgroud) 我想在 Node.JS 中测试Pocketsphinx。它说我需要安装 Swig 3.0.7 或更高版本。
我想我正确安装了所有其他依赖项。我现在甚至可以在终端中输入 Swig 命令,但是每次运行时我都会收到此错误npm install pocketsphinx:
CMake Error at /usr/local/Cellar/cmake/3.6.3/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
Could NOT find SWIG (missing: SWIG_DIR) (Required is at least version
"3.0.7")
Call Stack (most recent call first):
/usr/local/Cellar/cmake/3.6.3/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)
/usr/local/Cellar/cmake/3.6.3/share/cmake/Modules/FindSWIG.cmake:75 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
CMakeLists.txt:4 (find_package)
Run Code Online (Sandbox Code Playgroud)
我试过brew install swig, npm install swig, 和npm install -g swig。我尝试转到swig 下载页面并按照安装说明进行操作,但我似乎没有采取任何措施阻止错误发生。顺便说一下,我正在 Macbook 上尝试这个。
我真的不知道我在这里做什么。我只是想测试 Pocketsphinx,现在我已经在 4 个不同的地方安装了 Swig,而 CMake 似乎无法识别其中任何一个。
任何帮助都会很棒!
我试图想办法使这个代码变得简单,使用最少量的循环和变量,但我遇到了麻烦.
我希望根据'value'得到数组'numbers'中的平均对象.我觉得必须有一种数学方法来获得平均值,而不是在另一个循环中找到最接近的平均值.
目前我有这个烂摊子:
var numbers = [
{ value: 41 },
{ value: 19 },
{ value: 51 },
{ value: 31 },
{ value: 11 }
];
// Find average:
var sum = 0;
for (var i = 0; i < numbers.length; i++) {
sum += numbers[i].value;
}
var average = sum / numbers.length;
// Find closest object to average:
var match, difference;
for (var j = 0; j < numbers.length; j++) {
const diff = Math.abs(average - numbers[j].value); …Run Code Online (Sandbox Code Playgroud)我在顶点着色器中使用“属性”来定义几个变量,如下所示:
attribute mediump vec4 Position;
attribute lowp vec4 SourceColor;
Run Code Online (Sandbox Code Playgroud)
环顾四周,我发现了一个叫做“布局”的东西,它似乎在做同样的任务。
例如,我认为上述内容可以改写为:
layout(location = 0) in vec4 Position;
layout(location = 1) in vec4 SourceColor;
Run Code Online (Sandbox Code Playgroud)
我以前从未使用过布局,所以我不确定它的工作原理是否相同,但它看起来与我非常相似,而且 wiki 页面并不能特别帮助我区分它们。
有人可以解释一下属性和布局之间的区别吗?
我想根据单词是什么来更改句子中单词的背景颜色。
我希望用户能够像在文本区域中输入单词一样,但文本区域不支持单词背景颜色。
目前我只能想到这样的盗版解决方案:
var div = document.getElementById("div");
function highlight() {
var words = div.textContent.split(" ");
div.innerHTML = "";
for (var i = 0; i < words.length; i++) {
if (words[i] === "good") {
div.innerHTML += "<span style=\"background-color: green;\">" + words[i] + "</span> ";
} else if (words[i] === "bad") {
div.innerHTML += "<span style=\"background-color: red;\">" + words[i] + "</span> ";
} else {
div.innerHTML += "<span>" + words[i] + "</span> ";
}
}
var range = document.createRange();
var sel = …Run Code Online (Sandbox Code Playgroud)我正在尝试制作一个圆形粒子,看起来它的顶部有光。
这是我试图让它看起来像的:
这是它目前的样子:
由于我使用的是 GL_POINTS,我得到了 gl_PointCoord 变量,这应该会使事情变得更容易,除非我不知道如何正确使用它,这导致了这个混乱:
varying lowp vec4 DestinationColor;
void main(void) {
lowp vec2 circCoord = 2.0 * gl_PointCoord - 1.0;
if (dot(circCoord, circCoord) > 1.0) {
discard;
}
gl_FragColor = mix(DestinationColor, vec4(1, 0.5, 0.2, 1), (1.0-gl_PointCoord.t)*(max(abs(gl_PointCoord.t-0.5),abs(gl_PointCoord.s-0.5)))); // the world's worst slowest math
}
Run Code Online (Sandbox Code Playgroud)
我非常感谢任何帮助,因为我的数学技能很差,所以我被困住了。
所以,我之前在 Apple Developer Forums 上问过这个问题,但从来没有得到正确的答案,所以我想我会在这里问:
我正在尝试制作一个简单的游戏,当您击打某些东西时,该游戏的击打声会具有不同的音高。我认为这很简单,但最终得到了很多东西(其中大部分是我完全从别人那里复制的):
func hitSound(value: Float) {
let audioPlayerNode = AVAudioPlayerNode()
audioPlayerNode.stop()
engine.stop() // This is an AVAudioEngine defined previously
engine.reset()
engine.attach(audioPlayerNode)
let changeAudioUnitTime = AVAudioUnitTimePitch()
changeAudioUnitTime.pitch = value
engine.attach(changeAudioUnitTime)
engine.connect(audioPlayerNode, to: changeAudioUnitTime, format: nil)
engine.connect(changeAudioUnitTime, to: engine.outputNode, format: nil)
audioPlayerNode.scheduleFile(file, at: nil, completionHandler: nil) // File is an AVAudioFile defined previously
try? engine.start()
audioPlayerNode.play()
}
Run Code Online (Sandbox Code Playgroud)
由于此代码似乎停止播放当前正在播放的任何声音以播放新声音,有没有办法可以改变这种行为,使其不停止播放任何东西?我尝试删除 engine.stop 和 engine.reset 位,但这只会使应用程序崩溃。此外,这段代码在频繁调用时非常慢。有什么我可以做的来加快速度吗?非常频繁地需要这种击打声。
我试图获取 AVAudioPCMBuffer 的时间长度,但我似乎做不到。我尝试执行以下操作:
func getLength(buffer: AVAudioPCMBuffer) -> TimeInterval {
let framecount = buffer.frameCapacity
let bytesperframe = buffer.format.streamDescription.pointee.mBytesPerFrame
return TimeInterval(bytesperframe * framecount)
}
Run Code Online (Sandbox Code Playgroud)
但这给出了一个巨大的数字,这似乎不是我想要的。
编辑:我将代码更改为:
func getLength(buffer: AVAudioPCMBuffer) -> TimeInterval {
let framecount = Float64(buffer.frameCapacity)
let samplerate = buffer.format.streamDescription.pointee.mSampleRate
return TimeInterval(framecount / samplerate)
}
Run Code Online (Sandbox Code Playgroud)
这似乎可行,但似乎有点复杂。还有别的办法吗?
我正在尝试将自己的着色器用作SKSphaN的SKShader,但我只是不知道正确的方法.我想要的只是一种用自动完成来编写着色器代码的方法,并且可以看到着色器,而不必等待很长时间来编译它,但它似乎比我想象的更难.
我已经安装了GLFW3以及其他一些奇怪的东西,因为大多数教程都建议使用OpenGL这样的东西,但它似乎更多的是整个OpenGL,而不仅仅是一种特定的着色器.
TL; DR:有没有人知道在SpriteKit中编写着色器以用作SKShaders的快速而简单的方法?
我试图绘制一个简单的形状作为游戏界面的一部分,大多数教程使用UIBezierPath来定义CAShapeLayer的路径.但是,我注意到UIBezierPath已经有了一个现有的填充功能.
这可能是一个愚蠢的问题,但使用它和使用单独的CAShapeLayer绘制路径有什么区别?还有哪一个更好?
我在Swift做了一个简单的游戏,我试图找到一个很好的方法来获得游戏场景的中心.目前我正在这样做:
CGPoint(x: size.width / 2, y: size.height / 2)
Run Code Online (Sandbox Code Playgroud)
看起来很简单.但是,在检查时,我发现这四件事也作为GameScene类的一部分存在:
self.frame
self.size
self.view.bounds
self.view.frame
Run Code Online (Sandbox Code Playgroud)
我很困惑.我应该使用哪一个?它们对我来说都是一样的.有什么不同?
swift ×7
ios ×5
opengl-es ×3
audio ×2
avfoundation ×2
javascript ×2
arrays ×1
audiotoolbox ×1
average ×1
cashapelayer ×1
cmake ×1
css ×1
glsl ×1
html ×1
node.js ×1
pitch ×1
pocketsphinx ×1
skcameranode ×1
skspritenode ×1
sprite-kit ×1
swig ×1
textarea ×1
touchesbegan ×1
touchesmoved ×1
uibezierpath ×1
xcode ×1