【问题标题】:UIWebView - Load local audio file into html via UIWebViewUIWebView - 通过 UIWebView 将本地音频文件加载到 html 中
【发布时间】:2012-11-19 22:47:45
【问题描述】:

我正在尝试将本地 mp3 文件的路径发送到 javascript,并从那里创建一个填充了源的音频标签。但是,当我尝试此操作时,会出现“无法播放音频文件”消息。文件本身来自应用程序特定的沙箱,因此路径看起来像这样

/Users/username/Library/Application Support/iPhone Simulator/6.0/Applications/818263D7-4246-4DEC-9186-6AC14F0175A3/Documents/audiofile.mp3

问题是我可以使用相同的方法从我的桌面播放 mp3,而不是存储在应用程序本身的沙盒或本地文件系统中的 mp3。这是我用来获取路径并通过 webview 将其发送到 javascript 的代码。任何帮助将不胜感激。

UIWebView *webContainer = [[UIWebView alloc] initWithFrame: self.view.bounds];
webContainer.backgroundColor = [UIColor grayColor];
webContainer.autoresizingMask = ( UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight );
[webContainer setBackgroundColor:[UIColor clearColor]];
webContainer.delegate = self;
[self.view addSubview:webContainer];

NSString *imagePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,         NSUserDomainMask, YES) objectAtIndex:0];

NSString *imPath = [NSString stringWithFormat:@"%@/angels.mp3",imagePath];
imPath = [imPath stringByReplacingOccurrencesOfString:@" " withString:@"%20"];

[webContainer stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"setupAudio('%@');", imPath]];

【问题讨论】:

  • setupAudio() 在这里工作怎么样?它来自哪里,它的目的是什么?您在评估 JS 时是否查看过生成的字符串,是您所期望的吗?
  • setupAudio 函数非常简单,它构建音频标签标记并使用 jquery 将其添加到 dom,如下所示:function setupAudio($path){ var tx = '<audio class="dioHold" controls="controls"><source class="dio" src="'+$path+'" type="audio/mp3"></audio>'; $('.ac').append(tx); }

标签: objective-c cocoa-touch uiwebview uiwebviewdelegate


【解决方案1】:

如果您的路径以“audiofile.mp3”结尾,我认为文件“angels.mp3”不会播放。

但您可以只使用MPMoviePlayerController 来播放文件:

NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,             NSUserDomainMask, YES) objectAtIndex:0];

NSString *audioPath = [NSString stringWithFormat:@"%@/angels.mp3",docPath];

MPMoviePlayerController* moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: audioPath];

[moviePlayer.view  setFrame:self.view.bounds]; 

//add it to your view
[viewController.view addSubview:moviePlayer.view];

//if you don't want any controls
[moviePlayer setControlStyle:MPMovieControlStyleNone];

//play!
[moviePlayer prepareToPlay];

修改源来自some 示例。

可以在here 找到有关此主题的其他一些方便的相关问题。

【讨论】:

  • initWithContentURL 需要一个 NSURL 对象,而不是一个 NSString
  • 另外,对于这个例子,[moviePlayer.view setFrame:CGRectMake()] 应该是 [moviePlayer.view setFrame:self.view.bounds],以模拟 UIWebView
  • 这可能是一个很好的备份,但不幸的是我需要尝试让文件从 html 本身播放。原因是基于应用程序本身最初是如何创建的。我尝试了你的解决方案,它确实有效,所以也许我会推迟一点,看看我是否可以使用 Objective-c 播放音频。
  • @WDUK,正确!我更新了答案。好吧,祝杜兰好运!
【解决方案2】:

如果您必须使用UIWebView,并且只想使用音频文件,则可以使用 URL 请求直接加载它(当然,请确保该文件存在于该 URL! )。

NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *audioPath = [NSString stringWithFormat:@"%@/angels.mp3",docPath];

NSURL *url = [NSURL fileURLWithPath:audioPath isDirectory:NO];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

[webContainer loadRequest:request];

【讨论】:

  • 我试过了,但没用。不过,我会继续努力,看看我是不是做错了什么。问题是我在加载新数据时无法重新加载页面。我只需要播放音频而不替换或删除其他内容(如果有意义的话)。到目前为止,每当我尝试将 loadRequest 与 UIWebView 一起使用时,页面都会重新加载并且我的动态放置的数据会消失。
猜你喜欢
  • 2011-06-06
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2011-01-02
  • 1970-01-01
  • 2014-12-26
相关资源
最近更新 更多