我正在尝试以1024字节的块读取MP4文件。我编写的代码几乎可以正常工作。我正在执行以下操作:
let audioFilePath = Bundle.main.path(forResource: "video", ofType: "mp4")!
var chunks = [[UInt8]]()
if let stream: InputStream = InputStream(fileAtPath: audioFilePath) {
var buf: [UInt8] = [UInt8](repeating: 0, count: 1024)
stream.open()
while stream.hasBytesAvailable {
stream.read(&buf, maxLength: 1024)
chunks.append(buf)
}
stream.close()
}
print(chunks.count)
上面代码的问题是,我正在读取大小为15.948.514字节的MP4文件。这意味着它应该精确地在15.574个块中完成(最后一个块可能少于1024个,但这不是问题),但是代码将打印出15.576个块,并且所有块的大小均为1024。上面的代码有什么问题? ?
hasBytesAvailable
也可以返回hasBytesAvailable
。这就是您遇到的情况:最终读取返回的“文件结尾”为零。
true
对于TCP套接字之类的输入流很有用,以避免阻塞hasBytesAvailable
,但从文件中读取并不是真正需要的。在任何情况下,您都必须检查read()
的返回值,该值可以为零(文件末尾)或read()
(读取错误)或读入缓冲区的实际字节数(可以小于以下值)。要求的字节)。
也请注意,即使缓冲区仅部分填充了输入流中的字节,也总是将具有1024个字节的块附加到-1
数组中。
chunks