【问题标题】:iPhone: AVAudioPlayer unsupported file typeiPhone:AVAudioPlayer 不支持的文件类型
【发布时间】:2011-06-21 13:32:04
【问题描述】:

我的应用从我们的服务器下载 mp3 并将其播放给用户。该文件为 64 kbps(如果我理解正确,这在 iPhone 可接受的范围内)。我在几十个网站上查找了如何做到这一点,他们都建议我这样做:

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://.../file.mp3"]];
NSError *e = nil;
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:data error&e];
[player setDelegate:self];

当我运行代码时,播放器返回 null 并且我收到此错误:

2011-02-04 10:44:46.176 MyApp[6052:207] Error loading audio: Error Domain=NSOSStatusErrorDomain Code=1954115647 "The operation couldn’t be completed. (OSStatus error 1954115647.)"
2011-02-04 10:44:49.647 MyApp[6052:207] unsupported file type

我已经检查了该文件,并且知道它可以正常工作。它可以在 Windows Media Player 和 Mac 上的 Quicktime 上正常播放。我也将文件上传到 iPhone 模拟器,它播放没有任何问题。该文件很好,但由于某种原因 AVAudioPlayer 不喜欢它。

有什么我需要改变的吗? NSData 是否有某种设置来指定它是哪种文件?有人知道吗?

【问题讨论】:

    标签: iphone ios mp3 avaudioplayer


    【解决方案1】:

    从 iOS 7 开始,AVAudioPlayer 有了新的初始化程序

    NSError *error;
    [[AVAudioPlayer alloc] initWithData:soundData fileTypeHint:AVFileTypeMPEGLayer3 error:&error]
    

    支持的尿路感染

    NSString *const AVFileType3GPP;
    NSString *const AVFileType3GPP2;
    NSString *const AVFileTypeAIFC;
    NSString *const AVFileTypeAIFF;
    NSString *const AVFileTypeAMR;
    NSString *const AVFileTypeAC3;
    NSString *const AVFileTypeMPEGLayer3;
    NSString *const AVFileTypeSunAU;
    NSString *const AVFileTypeCoreAudioFormat;
    NSString *const AVFileTypeAppleM4V;
    NSString *const AVFileTypeMPEG4;
    NSString *const AVFileTypeAppleM4A;
    NSString *const AVFileTypeQuickTimeMovie;
    NSString *const AVFileTypeWAVE;
    

    【讨论】:

    • 谢谢。你对我的回答非常有帮助!
    • 出色的答案,谢谢!在某些方面,它似乎是 iOS 9 的救援解决方案......
    【解决方案2】:

    如果您的产品名称包含空格,您将收到错误消息。
    我的项目的产品名称是:Panorama 1453 TR。 initWithContentsOfURL 方法无法获取文件路径。所以它不起作用。 您可以将断点设置为 NSURL *fileURL = 。一步之后你可以看到 fileURL 有什么数据。
    我改为 Panorama1453TR ,它确实有效。

    【讨论】:

      【解决方案3】:

      我们正在处理同样的问题 - 我们必须先将文件写入磁盘。我最终发现我们正在下载的数据在开始时有额外的空白字节。当使用initWithContentsOfURL 从磁盘读取时,AVAudioPlayer 知道如何处理这个问题,但是当使用initWithData 从 NSData 加载时,它没有。修剪这些字节修复了它。

      【讨论】:

      • 哦,这很有趣。也许这应该作为一个错误提交给苹果?最后我还是选择了保存的文件,因为它更适合我们想要做的事情。感谢您的提示!
      • 您如何确切知道要修剪哪些字节以及您是如何做到的?
      • @typeoneerror :我拿了一个特定的文件,用十六进制编辑器查看了它,并阅读了 mp3 规范以了解标题是如何定义的。就在那时,我注意到了差异。不是很笼统,我知道...以编程方式,您可以查看 NSData 的第一个字节并跳过任何为 0 的字节。
      • @Don,我查看了一个编辑器,发现大多数第一个字节都是 0,但不是全部。我怎么知道什么时候可以安全跳过?
      • @user592419 查看描述 mp3 帧的datavoyage.com/mpgscript/mpeghdr.htm,第一帧应该设置前 11 个字节。我不是音频专家,自从我看这个已经有一段时间了,但也许尝试寻找第一帧并忽略它​​之前的所有内容。我想知道这是否有效。
      【解决方案4】:

      我终于找到了解决这个问题的方法!我没有使用 NSData 对象初始化音频播放器,而是将文件保存到 Documents 文件夹,然后使用文件 URL 初始化播放器

      //download file and play from disk
      NSData *audioData = [NSData dataWithContentsOfURL:someURL];
      NSString *docDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
      NSString *filePath = [NSString stringWithFormat:@"%@/%@.mp3", docDirPath , fileName];
      [audioData writeToFile:filePath atomically:YES];
      
      NSError *error;
      NSURL *fileURL = [NSURL fileURLWithPath:filePath];
      player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
      if (player == nil) {
          NSLog(@"AudioPlayer did not load properly: %@", [error description]);
      } else {
          [player play];
      }
      

      应用程序处理完文件后,可以将其删除。希望他的帮助不仅仅是我!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-25
        • 1970-01-01
        • 2020-08-11
        • 2020-12-01
        • 2019-04-21
        • 2011-01-31
        • 2017-04-27
        • 2018-06-18
        相关资源
        最近更新 更多