从 URL 下载音频文件并在 iOS 应用程序中播放

Posted

技术标签:

【中文标题】从 URL 下载音频文件并在 iOS 应用程序中播放【英文标题】:Download Audio file from URL and play it in iOS App 【发布时间】:2017-01-12 10:12:54 【问题描述】:

我有一个从 JSON 响应中获得的 URL,当我在浏览器中点击 URL 时,文件被下载,现在我想知道如何播放这样的 URL,它是一个下载 URL。我一直在寻找很多帖子但是他们都不能帮助我。

获取的网址类型:http://www.smartivr.in/sounds/voicemail/download/f77245d9-e7ee-4424-850c-6a45022d0a54_1

下面是我试过的代码。

  NSString *audio=[NSString stringWithFormat:@"%@.mp3",cell.url];
  NSLog(@"url:%@",audio);

  NSURL  *url = [NSURL fileURLWithPath:audio];
  NSData *soundData = [NSData dataWithContentsOfURL:url];
  NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                               NSUserDomainMask, YES) objectAtIndex:0]
                          stringByAppendingPathComponent:@"sound.caf"];
    [soundData writeToFile:filePath atomically:YES];
    NSError *error;
    _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL
                                                           fileURLWithPath:filePath] error:&error];
    [_audioPlayer play];
    NSLog(@"error %@", error);

【问题讨论】:

您应该尝试从 url 流式传输音频文件。编辑:@Marek 所说的。 @Ramon 但它是一个下载网址。 @Shikha Sharma 您想从下载的 filePath 还是从您的在线 url 播放音频? @DipankarDas 我只需要播放音频,不管怎样。 首先,URL 是一个远程 URL,所以你必须使用 [NSURL URLWithString... 初始化器,并且通常不要使用像 @ 这样的同步方法从远程 URL 加载数据987654324@。使用异步工作的URLSession 【参考方案1】:

试试这个:

    //download your audio file
    NSString *urlString = @"http://www.smartivr.in/sounds/voicemail/download/f77245d9-e7ee-4424-850c-6a45022d0a54_1.mp3";
    NSURL  *url = [NSURL fileURLWithPath:urlString];
    NSData *soundData = [NSData dataWithContentsOfURL:url];
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                               NSUserDomainMask, YES) objectAtIndex:0]
                          stringByAppendingPathComponent:@"sound.caf"];
    [soundData writeToFile:filePath atomically:YES];

    // get the file from directory
    NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
    NSString *documentsDirectory = [pathArray objectAtIndex:0];
    NSString *soundPath = [documentsDirectory stringByAppendingPathComponent:@"sound.caf"];

    NSURL *soundUrl;
    if ([[NSFileManager defaultManager] fileExistsAtPath:soundPath])
    
        soundUrl = [NSURL fileURLWithPath:soundPath isDirectory:NO];
    

    // play audio file
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:nil];
    [audioPlayer prepareToPlay];
    [audioPlayer play];

您应该异步下载音频文件。

【讨论】:

但我听不见,我应用了相同的代码,虽然音量按钮正在工作,否则它没有显示。但听不见 :( 可能是什么原因,我的设备听不到它 你可以在你的模拟器上查看。 添加这个 [audioPlayer setVolume:1.0];声音。 嘿,我知道了【参考方案2】:

感谢 Dipankar Das 的帮助。 我在这里发布了整个解决方案。 这对我绝对有用。

    NSString *audio=@"http://www.smartivr.in/sounds/voicemail/download/f77245d9-e7ee-4424-850c-6a45022d0a54_1.mp3";
    NSURL  *url = [NSURL URLWithString:audio];
    NSData *soundData = [NSData dataWithContentsOfURL:url];
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                               NSUserDomainMask, YES) objectAtIndex:0]
                          stringByAppendingPathComponent:@"sound.caf"];
    [soundData writeToFile:filePath atomically:YES];

    // get the file from directory
    NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
    NSString *documentsDirectory = [pathArray objectAtIndex:0];
    NSString *soundPath = [documentsDirectory stringByAppendingPathComponent:@"sound.caf"];

    NSURL *soundUrl;
    if ([[NSFileManager defaultManager] fileExistsAtPath:soundPath])
    
        soundUrl = [NSURL fileURLWithPath:soundPath isDirectory:NO];
    

    // plau audio file
    AVAudiosession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:nil];
    [_audioPlayer prepareToPlay];
    [_audioPlayer play];
    [_audioPlayer setVolume:5.0];

【讨论】:

我有一个 mp3 URL,我想在 avplayer 中播放。我已经尝试了所有可能的方法,但它只是不播放这首歌。有人知道从给定网址支付歌曲的任何方法吗?【参考方案3】:

尝试使用 AVPlayer 或 AVPlayerViewController,可以使用直接 URL 播放 mp3 文件

即使是本地文件,您也会先将其下载到设备,然后从本地 URL 播放

不要忘记,由于自动释放,对象 AVPlayer 必须作为类的属性而不是本地对象,因此在类中声明您的播放器变量并在函数中设置,而不仅仅是在函数中本地并尝试播放...

[更新]

更多细节如何做 -> How to play video with AVPlayerViewController (AVKit) in Swift

【讨论】:

这就是我想知道的。如何准确下载它然后播放。因为我尝试了很多方法,但都没有奏效。如果您愿意提供一些代码,我将不胜感激。 哪里出了问题?你至少应该描述到底是什么以及哪个步骤不起作用 我有一个 mp3 URL,我想在 avplayer 中播放。我已经尝试了所有可能的方法,但它只是不播放这首歌。有人知道从给定网址支付歌曲的任何方法吗?【参考方案4】:

这里是错误

NSString *audio=[NSString stringWithFormat:@"%@.mp3",cell.url];
NSURL  *url = [NSURL fileURLWithPath:audio];

我假设它是一个远程 url,你不能把它当作一个文件 url。所以你必须使用

NSURL  *url = [NSURL urlWithString:audio];

【讨论】:

以上是关于从 URL 下载音频文件并在 iOS 应用程序中播放的主要内容,如果未能解决你的问题,请参考以下文章

AWS S3 IOS中的混乱sdk?

iOS 从 url 下载 html 文件

Cordova 播放本地音频文件

iOS 9 无法播放下载到设备的音频/视频文件

如何从 Angular 6 中的 blob URL 下载音频文件?

使用语音框架 iOS 从音频文件生成字幕