我正在构建一个应用程序,我正在尝试编写一个webjob来获取一个mp4文件,我已经上传到blob存储并创建一个资产,然后我可以编码并准备使用azure媒体服务流 .
public class Functions
{
// This function will get triggered/executed when a new message is written
// on an Azure Queue called queue.
static string accName = "copied from portal ";
static string accKey = "as above";
static CloudMediaContext context = new CloudMediaContext(accName,accName);
// Use the cached credentials to create CloudMediaContext.
//static CloudMediaContext context = new CloudMediaContext(accName,accKey);
public static void ProcessVideo(
[QueueTrigger("videorequest")] VideoBlobInformation blobInfo,
[Blob("{ProfileId}/{BlobName}", FileAccess.Read)] Stream input,
[Blob("{ProfileId}/{BlobNameWithoutExtension}_stream.mp4")] CloudBlockBlob outputBlob)
{
VideoBlobInformation b = blobInfo;
using (Stream output = outputBlob.OpenWrite())
{
ConvertAndPrepareVideo(b,input, output);
}
// Entity Framework context class is not thread-safe, so it must
// be instantiated and disposed within the function.
using (impulsevidContext db = new impulsevidContext())
{
//var id = blobInfo.ProfileId;
//Video ad = db.Videos.Find(id);
//if (ad == null)
//{
// throw new Exception(String.Format("AdId {0} not found, can't create thumbnail", id.ToString()));
//}
//ad.StreamUrl = outputBlob.Uri.ToString();
//db.SaveChanges();
}
}
public static void ConvertAndPrepareVideo(VideoBlobInformation info,Stream input, Stream output)
{
var storageAccount = new CloudStorageAccount(new StorageCredentials("accnameofstorage", "storage account associated with azure media services"), true);
//output all webjob input blobs into a container -mediacontroller-
var cloudBlobClient = storageAccount.CreateCloudBlobClient();
var mediaBlobContainer = cloudBlobClient.GetContainerReference("impfile");
mediaBlobContainer.CreateIfNotExists();
IAsset sourceAsset = context.Assets.Where(a => a.Id == info.VideoId).First();
}
我正在使用我上传到的单个存储帐户 . 我不断得到这个错误400无论我尝试由这条线引起的
IAsset sourceAsset = context.Assets.Where(a => a.Id == info.VideoId).First();
这会导致此日志错误
Microsoft.Azure.WebJobs.Host.FunctionInvocationException:执行函数时出现异常:Functions.ProcessVideo ---> System.Net.WebException:远程服务器返回错误:(400)错误请求 . 在System.Net.WebClient.UploadValues(Uri地址,String方法,NameValueCollection数据)处于System.Net.WebClient.UploadValues(String address,String method,NameValueCollection data)at Microsoft.WindowsAzure.MediaServices.Client.AcsTokenProvider . <> c__DisplayClass47_2 Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction [TResult](Func1 func)at Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction(Action action)中的Microsoft.Practices.TransientFaultHandling.RetryPolicy . <> c__DisplayClass1.b__0() )Microsoft.WindowsAzure.MediaServices.Client.AcsTokenProvider.RefreshToken()at Microsoft.WindowsAzure.MediaServices.Client.AcsTokenProvider.GetAccessToken()at Microsoft.WindowsAzure.MediaServices.Client.AcsTokenProvider.GetAuthorizationHeader()at Microsoft.WindowsAzure.MediaServices . Microsoft.WindowsAzure.MediaServices.Client.AzureMediaServicesClassFactory中的Client.OAuth.OAuthDataServiceAdapter.AddAccessTokenToRequest(WebRequest请求) . <> c__Displ ayClass21_0 . <GetAccountApiEndpoint> b__0()at Microsoft.Practices.TransientFaultHandling.RetryPolicy . <> c__DisplayClass1 . <ExecuteAction> b__0()at Microsoft.WindowsAzure.MediaServices.Client.TransientFaultHandling.MediaRetryPolicy.ExecuteAction [TResult](Func1 func)at Microsoft .Practices.TransientFaultHandling.RetryPolicy.ExecuteAction(动作动作)在Microsoft.WindowsAzure.MediaServices.Client.AzureMediaServicesClassFactory.GetAccountApiEndpoint(OAuthDataServiceAdapter dataServiceAdapter,ServiceVersionAdapter versionAdapter,乌里API服务器,userAgentAdapter userAgentAdapter,IWebRequestAdapter clientRequestIdAdapter)在Microsoft.WindowsAzure.MediaServices.Client.AzureMediaServicesClassFactory . <> c__DisplayClass24_0.b__0()at Microsoft.WindowsAzure.MediaServices.Client.Cache1.GetOrAdd(String key,Func1 valueFactory,Func1 expirationFactory)at Microsoft.WindowsAzure.MediaServices.Client.AzureMediaServicesClassFactory.CreateAzureMediaServicesEndPoint(Uri azureMediaServicesEndpoint,Media ContextBase mediaContext)位于Microsoft.WindowsAzure.MediaServicesClassFactory上的Microsoft.WindowsAzure.MediaServices.Client.AzureMediaServicesClassFactory..ctor(Uri azureMediaServicesEndpoint,CloudMediaContext mediaContext),以及Microsoft.WindowsAzure.MediaServices.Client.AssetCollection . < . 的Microsoft.WindowsAzure.MediaServices.Client.CloudMediaContext.get_MediaServicesClassFactory() . ctor> b__2_0()位于Microsoft.WindowsAzure.MediaServices上的Microsoft.WindowsAzure.MediaServices.Client.AssetCollection.get_Queryable()的System.Lazy1.get_Value()处的System.Lazy1.LazyInitValue()处的System.Lazy1.CreateValue()处 . 在VideoProcess.Functions.ProcessVideo的VideoProcess.Functions.ConvertAndPrepareVideo(VideoBlobInformation info,Stream input,Stream output)的System.Linq.Queryable.Where [TSource](IQueryable1源,Expression1谓词)上的Client.BaseCollection1.get_Provider()VideoBlobInformation blobInfo ,流输入,CloudBlockBlob outputBlob)在Microsoft.Azure.WebJobs.Host.Executors.VoidMethodIn的lambda_method(Closure,Functions,Object []) Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`1.d__8.MoveNext()中的voker1.InvokeAsync(TReflected instance,Object [] arguments)从抛出异常的上一个位置开始的堆栈跟踪结束--- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务),位于Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__22.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) . 来自抛出异常的先前位置的堆栈跟踪---在System.Runtime.CompilerServices.Throw上的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务),System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd上的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) (任务任务)在Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__21.MoveNext()---从抛出异常的上一个位置的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuc Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__19.MoveNext()中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的cess(任务任务)---来自先前位置的堆栈跟踪结束,其中异常是抛出---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)at atSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务),位于Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__13.MoveNext()的System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务) . 内部异常堆栈跟踪---在Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__13.MoveNext()中的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()---来自先前位置的堆栈跟踪结束,其中异常是抛出---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处于System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务),位于Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d__10.MoveNext()
1 回答
context = new CloudMediaContext(new MediaServicesCredentials(accName,accKey));应该在ConvertAndPrepareVideo方法中设置,而不是在外面