【Azure 媒体服务】记使用 Media Service 的官网示例代码 Audio Analyzer 出现卡顿在 Creating event processor host .. 直到 Timeout 问题
问题描述
在使用Azure Media Service的官网示例 (media-services-v3-java --> AudioAnalytics --> AudioAnalyzer )代码的过程中,根据配置添加了 Event Hub 和Storage Account,使用 Event Grid 来获取获取Job的运行状态。
Analyze a media file with a audio analyzer preset
Optional, do the following steps if you want to use Event Grid for job monitoring
Please note, there are costs for using Event Hub. For more details, refer Event Hubs pricing and FAQ
Enable Event Grid resource provider
az provider register --namespace Microsoft.EventGridTo check if registered, run the next command. You should see "Registered"
az provider show --namespace Microsoft.EventGrid --query "registrationState"Create an Event Hub
namespace=<unique-namespace-name>hubname=<event-hub-name>az eventhubs namespace create --name $namespace --resource-group <resource-group>az eventhubs eventhub create --name $hubname --namespace-name $namespace --resource-group <resource-group>Subscribe to Media Services events
hubid=$(az eventhubs eventhub show --name $hubname --namespace-name $namespace --resource-group <resource-group> --query id --output tsv)amsResourceId=$(az ams account show --name <ams-account> --resource-group <resource-group> --query id --output tsv)az eventgrid event-subscription create --resource-id $amsResourceId --name <event-subscription-name> --endpoint-type eventhub --endpoint $hubidCreate a storage account and container for Event Processor Host if you don't have one Create a storage account for Event Processor Host
Update appsettings.json with your Event Hub and Storage information StorageAccountName: The name of your storage account.
StorageAccountKey: The access key for your storage account. Navigate to Azure portal, "All resources", search your storage account, then "Access keys", copy key1.
StorageContainerName: The name of your container. Click Blobs in your storage account, find you container and copy the name.
EventHubConnectionString: The Event Hub connection string. search your namespace you just created. <your namespace> -> Shared access policies -> RootManageSharedAccessKey -> Connection string-primary key.
EventHubName: The Event Hub name. <your namespace> -> Event Hubs.
但根据文档配置完成后,运行代码,出现长时间卡顿。根据日志输出,卡顿在 “Creating an event processor host to process events from Event Hub...:” 直到Timeout为止。
Creating a transform...
Transform created
Creating an input asset...
Uploading a media file to the asset...
Creating a job...
Creating an event processor host to process events from Event Hub...:2022-10-02T12:09:05.694
Timeout happened.
Job final state received, unregistering event processor... Job elapsed time: 1800 second(s).
Job finished.
这是为什么呢?
怎么解决卡顿问题呢?
问题解决
因为上面的代码使用了Azure Event Hub Hub,所以需要了解客户端是如何从 Event Hub中获取到数据。
简单来讲,Event Hub作为一个中转的消息中心,需要用户自动的发送,接收消息。
本例中,通过Event Grid订阅了Media Service Job的输出内容并通过服务自动发送到Event Hub中。所以在 AudioAnalyzer 代码中,我们只处理了接收消息。
AudioAnalyzer.java 中声明了封装好的 MediaServicesEventProcessor对象。
// Create a event processor host to process events from Event Hub.
Object monitor = new Object();
eventProcessorHost = new MediaServicesEventProcessor(jobName, monitor, null,
config.getEventHubConnectionString(), config.getEventHubName(),
container); // Define a task to wait for the job to finish.
Callable<String> jobTask = () -> {
synchronized (monitor) {
monitor.wait();
}
return "Job";
};
MediaServicesEventProcessor.java 中初始化 Event process Host对象。使用的Azure官方 com.azure.messaging.eventhubs.EventProcessorClient 包
public MediaServicesEventProcessor(String jobName, Object monitor, String liveEventName,
String eventHubConnectionString, String eventHubName,
BlobContainerAsyncClient container) { this.eventHubConnectionString = eventHubConnectionString;
this.eventHubName = eventHubName;
this.blobContainer = container; if (jobName != null) {
this.jobName = jobName.replaceAll("-", "");
} else {
this.jobName = null;
} this.monitor = buildEventProcessClient();
monitor = this.monitor; if (liveEventName != null) {
this.liveEventName = liveEventName.replaceAll("-", "");
} else {
this.liveEventName = null;
}
} ... private EventProcessorClient buildEventProcessClient() {
return new EventProcessorClientBuilder()
.connectionString(this.eventHubConnectionString, this.eventHubName)
.checkpointStore(new BlobCheckpointStore(this.blobContainer))
.consumerGroup("$Default")
.processEvent(eventContext -> this.processEvent(eventContext))
.processError(errorContext -> System.out.println("Partition "
+ errorContext.getPartitionContext().getPartitionId()
+ " onError: " + errorContext.getThrowable().toString()))
.processPartitionInitialization(initializationContextConsumer -> System.out.println("Partition "
+ initializationContextConsumer.getPartitionContext().getPartitionId() + " is opening"))
.processPartitionClose(closeContext -> System.out.println("Partition "
+ closeContext.getPartitionContext().getPartitionId()
+ " is closing for reason " + closeContext.getCloseReason().toString()))
.buildEventProcessorClient();
}
但是,对比Event Hub接收消息的示例代码,却发现缺少了最关键的 start 方法
System.out.println("Starting event processor");
eventProcessorClient.start();
因为Event Processor Client对象并没有启动,所以代码从Event Hub中根本不能接收消息,直到设定的Timeout时间(30分钟)到了为止。 这就是程序出现长时间卡顿的根源。
解决办法很简单,在MediaServicesEventProcessor.java 中添加 start 方法。并在 AudioAnalyzer.java 中调用
1: 在 MediaServicesEventProcessor.java 中添加 start

2: 在 AudioAnalyzer.java 中调用 start

修改完成后,重新启动程序,即可从Event Hub中获取到当前Job的状态

全部示例代码参考: https://github.com/LuBu0505/media-services-v3-java/tree/main/AudioAnalytics/AudioAnalyzer
参考资料
使用 Java 向/从 Azure 事件中心 (azure-messaging-eventhubs) 发送/接收事件: https://docs.azure.cn/zh-cn/event-hubs/event-hubs-java-get-started-send#receive-events
【Azure 媒体服务】记使用 Media Service 的官网示例代码 Audio Analyzer 出现卡顿在 Creating event processor host .. 直到 Timeout 问题的更多相关文章
- 【Azure媒体服务 Azure Media Service】Azure Media Service中Stream Endpoint 说明 (流式处理终结点)
Azure 媒体服务是一个基于云的媒体工作流平台,用于生成需要编码.打包.内容保护和直播活动广播的解决方案. 在视频的直播,点播方案中,媒体服务的架构主要由三部分构成: 推流端,把本地视频或直播内容推 ...
- Azure 媒体服务可将优质内容传输至 Apple TV
作为内容提供商,如果想要将优质内容传输到Apple TV,需要使用Apple FairPlay Streaming (FPS)技术. 但是这个技术的构建比较繁琐,基于此,Azure提供了FairPla ...
- Azure媒体服务的Apple FairPlay流功能正式上线
在此我们高兴地宣布,Azure FairPlay Streaming服务已正式商用. FairPlay允许用户轻松构建解决方案,并可扩展到最新版本的Apple TV.Azure媒体服务可以结合现有的P ...
- Azure 媒体服务发布可靠的视频直播平台
Sudheer Sirivara Azure 媒体服务总监 两个月前,Azure 媒体服务发布了视频直播和内容保护产品的公共预览版.这一 Internet规模的直播解决方案已被十余家业界领先的国际广播 ...
- Azure 媒体服务支持 DASH 实时传送流
Kilroy Hughes Azure媒体服务数字媒体架构师 本文重点介绍 Azure 媒体服务支持的 DASH 实时传送流功能,同时阐述如何利用这些功能将实时和点播自适应流传送至 Web 浏览器 ...
- Azure 媒体服务的 RTMP 支持和实时编码器
Cenk Dingiloglu Azure 媒体服务高级项目经理 直播流媒体目前已在公共预览版中提供,其中一项受支持的输入协议便是 RTMP.RTMP 是用于输入和分发包括直播流媒体在内的丰富媒体的一 ...
- 通过新的 Azure 媒体服务资源管理器工具管理媒体工作流
Xavier Pouyat Azure 媒体服务高级项目经理 几个月前,一家广播公司找到了我,希望我向他们提供一种图形界面工具,好让他们使用 Azure媒体服务来上传.管理资产并对资产进行编 ...
- 中国Azure媒体服务RESTAPI的Endpoint
Amber Zhao Thu, Feb 26 2015 4:09 AM 由于海外Azure和中国Azure有不同的domain,很多用户在使用媒体服务RESTAPI时,需要指定中国Azure媒体服务 ...
- 宣布正式发布 Azure 媒体服务内容保护服务
Mingfei Yan Azure媒体服务项目经理 我们非常高兴地宣布正式发布 Azure 媒体服务内容保护服务.这包括 Microsoft PlayReady许可服务和 AES明文密钥交付服务!此外 ...
- 通过 Azure 媒体服务进行高速编码
Milan Gada Azure 媒体服务首席项目经理 关于 Azure 媒体服务,客户问的最多的一个问题是能否进行高速编码.这个问题现在已经有了肯定的答案,目前有三种不同类型的 Encodin ...
随机推荐
- [译]深入了解现代web浏览器(三)
本文是根据Mariko Kosaka在谷歌开发者网站上的系列文章https://developer.chrome.com/blog/inside-browser-part3/ 翻译而来,共有四篇,该篇 ...
- Fabric-ca server端初始化过程源码分析
本文从Fabric-ca源码入手,简单分析server启动时的过程.Fabric-ca源码可以从github.com下载,本文以v1.4.6为例进行简单分析. Fabric-ca是有go语言编写的,与 ...
- MedicalGPT:基于LLaMA-13B的中英医疗问答模型(LoRA)
MedicalGPT:基于LLaMA-13B的中英医疗问答模型(LoRA).实现包括二次预训练.有监督微调.奖励建模.强化学习训练[LLM:含Ziya-LLaMA]. **** 训练医疗大模型,实现包 ...
- Markdown-CSDN自带帮助语法
这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...
- Libevent [补档-2023-08-29]
libevent的使用 8-1 安装 自己百度一下,安装它不是特别难,加油!!! 8-2 libevent介绍 它是一个开源库,用于处理网络和定时器等等事件.它提供了跨平台的API,能够在不同 ...
- VB6的WindowsXP控件引擎 - 开源研究系列文章
这几天翻了一下原来VB6的代码,将一些有用的代码进行了整理,然后将这些代码记录下来,开源出来,让需要的朋友能够进行代码复用. 这次介绍的是一个VB6的WindowXP的控件引擎代码,主要是在程序启动的 ...
- Softmax偏导及BP过程的推导
Softmax求导 其实BP过程在pytorch中可以自动进行,这里进行推导只是强迫症 A Apart证明softmax求导和softmax的BP过程 本来像手打公式的,想想还是算了,引用部分给出la ...
- JS leetcode 反转字符串中的单词 III 题解分析
壹 ❀ 引 又到了快乐的leetcode算法时间,今天的题目特别特别简单,来自leetcode557. 反转字符串中的单词 III,题目描述如下: 给定一个字符串,你需要反转字符串中每个单词的字符顺序 ...
- 49从零开始用Rust编写nginx,我竟然在同一个端口上绑定了多少IP
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,会将实 ...
- STM32的时钟控制RCC和外设定时器
STM32的RCC(Reset and Clock Control)时钟控制 stm32f103c8的时钟是72MHz, stm32f401ccu6的时钟是80M, 开发板板载两个晶振, 一个高速一个 ...