gpt4 book ai didi

Twilio 播放暂停/恢复

转载 作者:行者123 更新时间:2023-12-02 02:25:57 29 4
gpt4 key购买 nike

Twilio 是否支持暂停和恢复内容播放。换句话说,我有相当长的文件将播放给调用者,并且我正在尝试找到一种方法来实现暂停和恢复功能。在播放某些内容的过程中,我希望用户能够按数字暂停,然后再次按数字从音频文件暂停的同一点恢复播放。

Twilio 支持类似的功能吗?

最佳答案

我确实找到了一个可行的(尽管并不完美)解决方案来解决如何使用 Twilio 暂停和恢复播放。

基本思想是计算生成播放命令的时间与 Gather 的时间之间的时间差。调用 URL。区别(暂时假设完美世界)应该是内容在被调用者中断之前播放了多远。然后,当调用者准备好恢复时,生成 Play 命令,以便您的应用服务器传递的不是完整内容,而是从应该恢复播放的点开始的部分偏移内容(这可能意味着需要实现仅传送部分音频文件内容的机制)。这本质上是模拟暂停/恢复功能。

我已经实现了这个,它或多或少有效。不完美的世界会出现网络延迟、处理延迟(Twilio 接收 Play 命令、检索播放资源和实际开始播放之间的时间)以及按下按钮和实际播放之间的延迟。接收 Gather 调用都会影响准确性。但如果您的要求不太严格,那么对于大多数情况来说,准确性可能已经足够了。

这是我在 C# 中所做的概念验证(已经过去几个月了 - 希望它仍然像发布的那样工作)。它还包括快进和快退的实验,这只是调整恢复实际开始的位置(并跳过 Pause 命令)。

<小时/>

下面的代码适用于 PausablePlayController.cs,它使用 PlayPause 和其他命令生成 TwiML。

Play 操作(不是 TwiML 命令)生成用于播放内容的 TwiML。播放是可中断的,因为它包含在指向 Pause 操作的 Gather 中。 Gather 的 URL 包含播放开始位置的时间戳(如果之前已经偏移,则及时计算)。

Pause 操作(不是 TwiML 命令)生成用于执行暂停或查找的 TwiML。在下面的代码中,4 次快退,5 次从头开始,6 次快进,任何其他键都可以暂停。

public class PausablePlayController : ApiController
{
private const int seekDeltaMilliseconds = 5000;

// GET api/pausableplay/5
[HttpGet]
public System.Xml.Linq.XElement Play(string audio, int millisecondsOffset)
{
TwilioResponse twiml = new TwilioResponse();
twiml.BeginGather(new { action = this.Url.Link("PausablePlayPause", new { audio = audio, playStart = DateTime.UtcNow.Subtract(new TimeSpan(0, 0, 0, 0, millisecondsOffset)).Ticks/*.ToString("o", System.Globalization.CultureInfo.InvariantCulture )*/ }), method = "GET", numDigits = "1" });
twiml.Play(this.Url.Link("OffsetPresentations", new { audio = audio, millisecondsOffset = millisecondsOffset }));
twiml.EndGather();

return twiml.Element;
}

[HttpGet]
public System.Xml.Linq.XElement Pause(string audio, long playStart, int digits)
{
DateTime playStartDate = new DateTime(playStart, DateTimeKind.Utc);
int millisecondsOffset = (int)DateTime.UtcNow.Subtract(playStartDate).TotalMilliseconds;
TwilioResponse twiml = new TwilioResponse();
switch(digits)
{
case 4:
millisecondsOffset -= (millisecondsOffset < seekDeltaMilliseconds) ? millisecondsOffset : seekDeltaMilliseconds;
return Play(audio, millisecondsOffset);
case 5:
return Play(audio, 0);
case 6:
millisecondsOffset += seekDeltaMilliseconds;
return Play(audio, millisecondsOffset);
default:
{
twiml.BeginGather(new { action = this.Url.Link("PausablePlayPlay", new { audio = audio, millisecondsOffset = millisecondsOffset }), method = "GET", numDigits = "1" });
twiml.Pause(120);
twiml.EndGather();
twiml.Say("Goodbye!");
}
break;
}
return twiml.Element;
}
}

剩下的技巧就在下一个 Controller 中,它可以流式传输部分音频内容(不幸的是,我在其他帖子中找到了部分代码,但我不再引用了)。它所做的只是简单地计算给定毫秒偏移量的音频内容从哪里开始,并从该点开始传输其余内容。

public class OffsetedContentController : ApplicationController
{
const int BufferSize = 32 * 1024;

// GET api/prompts/5
public Task<HttpResponseMessage> Get(string audio, [FromUri]int millisecondsOffset)
{
string contentFilePath = audio; // Build physical path for your audio content

if (!File.Exists(contentFilePath))
{
return Task.FromResult(Request.CreateResponse(HttpStatusCode.NotFound));
}
// Open file and read response from it. If read fails then return 503 Service Not Available
try
{
// Create StreamContent from FileStream. FileStream will get closed when StreamContent is closed
FileStream fStream = new FileStream(contentFilePath, FileMode.Open, FileAccess.Read, FileShare.Read, BufferSize, useAsync: true);
fStream.Position = getPositionOffset(millisecondsOffset);
HttpResponseMessage response = Request.CreateResponse();
response.Content = new StreamContent(fStream);
response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("audio/ulaw");
return Task.FromResult(response);
}
catch (Exception e)
{
return Task.FromResult(Request.CreateErrorResponse(HttpStatusCode.ServiceUnavailable, e));
}
}

private long getPositionOffset(int millisecondsOffset)
{
long bytePosition = millisecondsOffset * 4;
return bytePosition;
}
}

关于Twilio 播放暂停/恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19880217/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com