我有一个 iOS 应用程序,目前它只是使用用户库中的 AVFoundation 播放视频。我想做的是根据视频的宽高比设置设备的方向。如果是纵向视频,我想将方向设置为纵向,如果标准 16:9 或 4:3,那么当然是横向,这样屏幕最终不会在黑条中浪费大量空间视频的两侧。
我想我可以通过获取视频的尺寸来确定纵横比,从而确定方向:
if width > height:
landscape
else:
portrait
Run Code Online (Sandbox Code Playgroud)
然而,事实证明这比我想象的要困难。我有一个AVPlayer对象,最初查看了它的元数据属性,但这显然不是我想要的元数据。然后我发现 AVPlayer.presentationSize 可以包含我正在寻找的信息,但是当我打印出来时 - 就在调用之前play()- 查看它时,我得到了以下信息:Optional((0.0, 0.0))
除了研究如何自己解析视频文件头以尝试访问此信息之外,API 中是否有任何地方可以向我公开此信息?谷歌搜索提供了大量有关如何在捕获视频时指定视频大小的信息,但关于这个特定问题的信息却很少。
去年我问了一个关于如何将语音保存到文件的问题。 堆栈溢出问题 - 将语音合成录制到保存的文件中
感谢 kakaiikaka 的回答。虽然它确实有效,但缓冲时出现了一些错误。以下代码隔离了该问题。在 iOS 16 中,尽管存在错误,但它确实可以按预期工作。我按预期打印的完成处理程序。以下错误打印了 20 次左右。
2023-06-17 15:35:33.811838-0400 RecordSpeechFix [3899:1958883] [AXTTSCommon] TTSPlaybackEnqueueFullAudioQueueBuffer:错误-66686排队缓冲区
iOS 17(第一个测试版)存在一个更具描述性的错误,并且它不起作用。完成处理程序不打印。以下错误打印了 20 次左右。
输入数据过程返回不一致的 512 个数据包(2,048 字节);按每个数据包 2 字节计算,实际上是 1,024 个数据包
我假设这是同一个问题。修复 iOS16 的错误也将修复 iOS17 的错误。我的这个假设可能是错误的。
//
// ContentView.swift
// RecordSpeechFix
//
// Created by Dennis Sargent on 6/16/23.
//
import AVFoundation
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundColor(.accentColor)
Text("Record Speech")
}
.padding()
.onTapGesture {
saveSpeechUtteranceToFile(phrase: "This produces warnings.") {
print("In …Run Code Online (Sandbox Code Playgroud) 问题是这样的:
我做了以下事情:
.plist背景模式是audio.didFinishLaunchingWithOptions[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
[[AVAudioSession sharedInstance] setActive:YES error:&error];
Run Code Online (Sandbox Code Playgroud)
我缺少什么?我检查了这error两种nil方法之后。