2017-10-14 4 views
0

J'essaye de faire une fonction qui utilise ffmpeg, jusqu'à présent je n'ai pas pu obtenir autre chose que la commande -version pour fonctionner correctement. Lorsque j'essaie d'exécuter une commande ffmpeg -i {input file path} {output file path} simple, la fonction semble être bloquée pendant 3-4 minutes (en train de créer un fichier de sortie vide), puis réessayer et produire l'erreur 'le fichier existe déjà'. J'ai essayé la commutation entre le ffmpeg.exe de 64 bits et le ffmpeg.exe de 32 bits avec la fonction s'exécutant en tant que fonction 32 et 64 bits. Mon code et les journaux associés d'essayer d'exécuter le code sont inclus ci-dessous, si quelqu'un peut me dire ce que je fais mal ou comment faire fonctionner le processus, il serait grandement apprécié. Merci d'avance, CuanFFmpeg sur l'appel de fonction Azure s'exécutant lentement et produisant un fichier de sortie vide

edit: Le processus fonctionne sur kudu avec les mêmes fichiers, la sortie est affichée en bas. Sur kudu, le processus s'est déroulé en moins d'une demi-minute, il est clair que quelque chose provoque le processus de la fonction, si quelqu'un a des conseils, il serait grandement apprécié. Merci encore, Cuan. Second edit: J'ai essayé d'ajouter le -y à la fin de ma commande, cela fonctionne en ce qu'il ne se plaint plus de l'écrasement, mais hélas, il bloque maintenant deux fois en raison de timeout. (sortie en bas)

éditer le troisième: azure a un moyen de vous permettre d'exécuter des fonctions localement, ma fonction a rencontré les mêmes problèmes sur la version locale mais: comme il se trouve le traitement réel est fait dans quelques secondes, il faut juste une éternité pour décider d'écrire dans un fichier - si vous terminez le processus manuellement après que le processus ait fonctionné pendant ~ 10 secondes, le fichier est immédiatement écrit. Encore une fois, toute aide est appréciée. Cuan.

Run.csx:

using System.Net; 
using System; 
using System.Diagnostics; 
using System.ComponentModel; 
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) 
{ 
    log.Info("C# HTTP trigger function processed a request."); 
    Process process = new Process(); 
    process.StartInfo.FileName = @"D:\home\site\wwwroot\HttpTestFunction\ffmpeg64.exe"; 
    string tmp = String.Format("-i \"" + "Airdocs Background Video.mp4" + "\" \"" + "tmpOut2.mp4" + "\""); 
    log.Info("ffmpeg argument is: "+tmp); 
    process.StartInfo.Arguments = tmp; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.StartInfo.RedirectStandardError = true; 
    process.StartInfo.WorkingDirectory = @"D:\home\site\wwwroot\HttpTestFunction"; 
    process.Start(); 
    log.Info("process started"); 
    string output = process.StandardOutput.ReadToEnd(); 
    string err = process.StandardError.ReadToEnd(); 
    log.Info("output:" + output); 
    log.Info("error:"+err); 
    process.WaitForExit(); 
} 

grumes:

2017-10-14T02:17:10.514 Function started (Id=e4ec7d1e-2bcb-4b74-8af2-15124f1576fb) 
2017-10-14T02:17:10.639 C# HTTP trigger function processed a request. 
2017-10-14T02:17:10.639 ffmpeg argument is: -i "Airdocs Background Video.mp4" "tmpOut2.mp4" 
2017-10-14T02:17:10.779 process started 
2017-10-14T02:18:15 No new trace in the past 1 min(s). 
2017-10-14T02:19:15 No new trace in the past 2 min(s). 
2017-10-14T02:20:15 No new trace in the past 3 min(s). 
2017-10-14T02:21:02.188 Function started (Id=b2ae9b59-8933-42e3-986c-fd26a6886285) 
2017-10-14T02:21:02.188 C# HTTP trigger function processed a request. 
2017-10-14T02:21:02.188 ffmpeg argument is: -i "Airdocs Background Video.mp4" "tmpOut2.mp4" 
2017-10-14T02:21:02.252 process started 
2017-10-14T02:21:02.377 output: 
2017-10-14T02:21:02.377 error:ffmpeg version N-87353-g183fd30 Copyright (c) 2000-2017 the FFmpeg developers 
    built with gcc 7.2.0 (GCC) 
    configuration: --enable-gpl --enable-version3 --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib 
    libavutil  55. 76.100/55. 76.100 
    libavcodec  57.106.101/57.106.101 
    libavformat 57. 82.101/57. 82.101 
    libavdevice 57. 8.101/57. 8.101 
    libavfilter  6.105.100/6.105.100 
    libswscale  4. 7.103/4. 7.103 
    libswresample 2. 8.100/2. 8.100 
    libpostproc 54. 6.100/54. 6.100 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Airdocs Background Video.mp4': 
    Metadata: 
    major_brand  : mp42 
    minor_version : 0 
    compatible_brands: mp41isom 
    creation_time : 2017-09-08T11:55:11.000000Z 
    Duration: 00:00:24.02, start: 0.000000, bitrate: 105 kb/s 
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1/0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 104 kb/s, 30.30 fps, 30.30 tbr, 30k tbn, 60 tbc (default) 
    Metadata: 
     creation_time : 2017-09-08T11:55:11.000000Z 
     handler_name : VideoHandler 
     encoder   : AVC Coding 
File 'tmpOut2.mp4' already exists. Overwrite ? [y/N] Not overwriting - exiting 
2017-10-14T02:21:02.392 Function completed (Success, Id=b2ae9b59-8933-42e3-986c-fd26a6886285, Duration=205ms) 
2017-10-14T02:22:10.563 Function completed (Failure, Id=e4ec7d1e-2bcb-4b74-8af2-15124f1576fb, Duration=300047ms) 
2017-10-14T02:22:10.610 Microsoft.Azure.WebJobs.Host: Timeout value of 00:05:00 was exceeded by function: Functions.HttpTestFunction. 

Code Kudu (juste en cours d'exécution de la commande ffmpeg directement, et non pas le fichier run.csx):

D:\home\site\wwwroot\HttpTestFunction>ffmpeg -i "Airdocs Background Video.mp4" tmpout3.mp4 


ffmpeg version N-87196-g6cadbb1 Copyright (c) 2000-2017 the FFmpeg developers 
    built with gcc 7.1.0 (GCC) 
    configuration: --enable-gpl --enable-version3 --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-zlib 
    libavutil  55. 74.100/55. 74.100 
    libavcodec  57.105.100/57.105.100 
    libavformat 57. 81.100/57. 81.100 
    libavdevice 57. 8.100/57. 8.100 
    libavfilter  6.101.100/6.101.100 
    libswscale  4. 7.103/4. 7.103 
    libswresample 2. 8.100/2. 8.100 
    libpostproc 54. 6.100/54. 6.100 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Airdocs Background Video.mp4': 
    Metadata: 
    major_brand  : mp42 
    minor_version : 0 
    compatible_brands: mp41isom 
    creation_time : 2017-09-08T11:55:11.000000Z 
    Duration: 00:00:24.02, start: 0.000000, bitrate: 105 kb/s 
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1/0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 104 kb/s, 30.30 fps, 30.30 tbr, 30k tbn, 60 tbc (default) 
    Metadata: 
     creation_time : 2017-09-08T11:55:11.000000Z 
     handler_name : VideoHandler 
     encoder   : AVC Coding 
Stream mapping: 
    Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264)) 
Press [q] to stop, [?] for help 
[libx264 @ 00000000005fc5a0] using SAR=1/1 
[libx264 @ 00000000005fc5a0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX 
[libx264 @ 00000000005fc5a0] profile High, level 3.2 
[libx264 @ 00000000005fc5a0] 264 - core 152 r2851 ba24899 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=1 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00 
Output #0, mp4, to 'tmpout3.mp4': 
    Metadata: 
    major_brand  : mp42 
    minor_version : 0 
    compatible_brands: mp41isom 
    encoder   : Lavf57.81.100 
    Stream #0:0(und): Video: h264 (libx264) (avc1/0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 30.30 fps, 16k tbn, 30.30 tbc (default) 
    Metadata: 
     creation_time : 2017-09-08T11:55:11.000000Z 
     handler_name : VideoHandler 
     encoder   : Lavc57.105.100 libx264 
    Side data: 
     cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1 
frame= 728 fps= 39 q=29.0 Lsize=  62kB time=00:00:23.92 bitrate= 21.1kbits/s speed=1.28x  
video:52kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 17.915474% 
[libx264 @ 00000000005fc5a0] frame I:4  Avg QP:12.46 size: 6102 
[libx264 @ 00000000005fc5a0] frame P:184 Avg QP:16.94 size: 45 
[libx264 @ 00000000005fc5a0] frame B:540 Avg QP:20.50 size: 37 
[libx264 @ 00000000005fc5a0] consecutive B-frames: 1.1% 0.0% 0.0% 98.9% 
[libx264 @ 00000000005fc5a0] mb I I16..4: 66.3% 30.4% 3.3% 
[libx264 @ 00000000005fc5a0] mb P I16..4: 0.0% 0.0% 0.0% P16..4: 0.0% 0.0% 0.0% 0.0% 0.0% skip:100.0% 
[libx264 @ 00000000005fc5a0] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 0.0% 0.0% 0.0% direct: 0.0% skip:100.0% L0:12.3% L1:87.7% BI: 0.0% 
[libx264 @ 00000000005fc5a0] 8x8 transform intra:30.5% inter:14.3% 
[libx264 @ 00000000005fc5a0] coded y,uvDC,uvAC intra: 2.3% 2.2% 2.1% inter: 0.0% 0.0% 0.0% 
[libx264 @ 00000000005fc5a0] i16 v,h,dc,p: 93% 6% 2% 0% 
[libx264 @ 00000000005fc5a0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 28% 41% 31% 0% 0% 0% 0% 0% 0% 
[libx264 @ 00000000005fc5a0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 39% 17% 16% 5% 4% 5% 6% 3% 5% 
[libx264 @ 00000000005fc5a0] i8c dc,h,v,p: 93% 6% 1% 0% 
[libx264 @ 00000000005fc5a0] Weighted P-Frames: Y:0.0% UV:0.0% 
[libx264 @ 00000000005fc5a0] ref B L1: 98.2% 1.8% 
[libx264 @ 00000000005fc5a0] kb/s:17.57 



D:\home\site\wwwroot\HttpTestFunction> 

sortie sur azur avec la commande -y

2017-10-25T04:34:45.519 Compilation succeeded. 
2017-10-25T04:34:46.160 Function started (Id=18880991-c93a-42a3-96b6-7df283e3bdb4) 
2017-10-25T04:34:46.300 C# HTTP trigger function processed a request. 
2017-10-25T04:34:46.300 ffmpeg argument is: -i "Airdocs Background Video.mp4" "tmpOut2.mp4" -y 
2017-10-25T04:34:46.394 process started 
2017-10-25T04:36:46 No new trace in the past 1 min(s). 
2017-10-25T04:37:46 No new trace in the past 2 min(s). 
2017-10-25T04:38:37.947 Function started (Id=c7f7f768-c53b-4074-a0c2-8391848bbd80) 
2017-10-25T04:38:37.963 C# HTTP trigger function processed a request. 
2017-10-25T04:38:37.963 ffmpeg argument is: -i "Airdocs Background Video.mp4" "tmpOut2.mp4" -y 
2017-10-25T04:38:38.025 process started 
2017-10-25T04:39:46 No new trace in the past 1 min(s). 
2017-10-25T04:39:46.258 Function completed (Failure, Id=18880991-c93a-42a3-96b6-7df283e3bdb4, Duration=300079ms) 
2017-10-25T04:39:46.321 Microsoft.Azure.WebJobs.Host: Timeout value of 00:05:00 was exceeded by function: Functions.HttpTestFunction. 
+0

Partagez le journal d'une exécution qui ne se plaint pas de l'écrasement. – Mulvya

Répondre

0

il se trouve, tout le problème a été causé par

string output = process.StandardOutput.ReadToEnd(); 
string err = process.StandardError.ReadToEnd(); 

ffmpeg fonctionne avec un grand nombre de messages de sortie/erreur, ce surchargeait le tampon et causant la chose à accrocher juste. La solution était de rendre ce processus événement se produit par l'événement

process.OutputDataReceived += new DataReceivedEventHandler(
    (s, e) => 
    { 
     log.Info("O: "+e.Data); 
    } 
); 
process.ErrorDataReceived += new DataReceivedEventHandler(
    (s, e) => 
    { 
     log.Info("E: "+e.Data); 
    } 
); 
//start process 
process.Start(); 
log.Info("process started"); 
process.BeginOutputReadLine(); 
process.BeginErrorReadLine(); 
process.WaitForExit(); 

en utilisant cette place des «ReadToEnd() a résolu tous mes problèmes, il fonctionne maintenant correctement et les lignes de sortie et d'erreur sont encore en cours de capture.

2

Le fichier 'tmpOut2.mp4' existe déjà. Écraser? [Y/N] n'écrasez pas - sortie

Vous pouvez ajouter l'option -y avec votre commande pour écraser les fichiers de sortie sans demander comme suit:

ffmpeg -i {input file path} {output file path} -y 

Pour plus d'options, vous pourriez se référer à here.

De plus, vous pouvez tirer parti kudu pour tester la conversion comme suit:

enter image description here

2017-10-14T02: 22: 10,610 Microsoft.Azure.WebJobs.Host: Valeur du délai de 00: 05h00 a été dépassé par la fonction: Functions.HttpTestFunction.

Il semble que vous utilisiez les références dynamiques.Comme host.json mentionné au sujet de functionTimeout comme suit:

Valeur indiquant la durée du délai d'attente pour toutes les fonctions.

  • Dans dynamique UGS, la plage valide est de 1 seconde à 10 minutes et la valeur par défaut est de 5 minutes.
  • Dans les références payantes, il n'y a pas de limite et la valeur par défaut est null (indiquant aucun délai).

Note: Si la conversation coûterait beaucoup de temps, vous avez besoin d'augmenter le functionTimeout ou modifier le type UGS. De plus, pour les SKU payantes, vous devez activer la fonction Always On, vous pouvez vous référer à here.