Recherche avancée

Médias (91)

Autres articles (75)

  • MediaSPIP version 0.1 Beta

    16 avril 2011, par

    MediaSPIP 0.1 beta est la première version de MediaSPIP décrétée comme "utilisable".
    Le fichier zip ici présent contient uniquement les sources de MediaSPIP en version standalone.
    Pour avoir une installation fonctionnelle, il est nécessaire d’installer manuellement l’ensemble des dépendances logicielles sur le serveur.
    Si vous souhaitez utiliser cette archive pour une installation en mode ferme, il vous faudra également procéder à d’autres modifications (...)

  • MediaSPIP 0.1 Beta version

    25 avril 2011, par

    MediaSPIP 0.1 beta is the first version of MediaSPIP proclaimed as "usable".
    The zip file provided here only contains the sources of MediaSPIP in its standalone version.
    To get a working installation, you must manually install all-software dependencies on the server.
    If you want to use this archive for an installation in "farm mode", you will also need to proceed to other manual (...)

  • Amélioration de la version de base

    13 septembre 2013

    Jolie sélection multiple
    Le plugin Chosen permet d’améliorer l’ergonomie des champs de sélection multiple. Voir les deux images suivantes pour comparer.
    Il suffit pour cela d’activer le plugin Chosen (Configuration générale du site > Gestion des plugins), puis de configurer le plugin (Les squelettes > Chosen) en activant l’utilisation de Chosen dans le site public et en spécifiant les éléments de formulaires à améliorer, par exemple select[multiple] pour les listes à sélection multiple (...)

Sur d’autres sites (13930)

  • xabe.ffmpeg not working in azure app service

    28 décembre 2020, par Sripathi Raja

    I have a .net core application which generates video thumbnails for uploaded videos. I am using xabe.ffmpeg for this . The code runs fine in the local system and Iam able to generate the thumbnails . I have containerized this application and pushed it to azure app service . But when the code is deployed on azure app service its throws an error . I have placed the ffmpeg.exe ,ffprobe.exe , ffplay.exe inside a folder ffmpeg in wwwroot folder .
the app service logs give this error

    


    the first line is the path : /app/wwwroot/ffmpeg

    


    2020-12-25T14:34:01.347103909Z /app/wwwroot/ffmpeg&#xA;2020-12-25T14:34:01.443016709Z [41m[30mfail[39m[22m[49m : Microsoft.AspNetCore.Server.Kestrel[13]&#xA;2020-12-25T14:34:01.443066009Z Connection id "0HM58S8AE014U", Request id "0HM58S8AE014U:00000002" : An unhandled exception was thrown by the application.&#xA;2020-12-25T14:34:01.456821709Z System.ComponentModel.Win32Exception (2) : No such file or directory&#xA;2020-12-25T14:34:01.462537109Z at System.Diagnostics.Process.ForkAndExecProcess(String filename, String[] argv, String[] envp, String cwd, Boolean redirectStdin, Boolean redirectStdout, Boolean redirectStderr, Boolean setCredentials, UInt32 userId, UInt32 groupId, UInt32[] groups, Int32& stdinFd, Int32& stdoutFd, Int32& stderrFd, Boolean usesTerminal, Boolean throwOnNoExec)&#xA;2020-12-25T14:34:01.462555709Z at System.Diagnostics.Process.StartCore(ProcessStartInfo startInfo)&#xA;2020-12-25T14:34:01.462560609Z at System.Diagnostics.Process.Start()&#xA;2020-12-25T14:34:01.463739309Z at Xabe.FFmpeg.FFmpeg.RunProcess(String args, String processPath, Nullable1 priority, Boolean standardInput, Boolean standardOutput, Boolean standardError) 2020-12-25T14:34:01.463755809Z    at Xabe.FFmpeg.FFprobeWrapper.&lt;>c__DisplayClass9_0.<runprocess>b__0() 2020-12-25T14:34:01.463761809Z    at System.Threading.Tasks.Task</runprocess>1.InnerInvoke()&#xA;2020-12-25T14:34:01.463766309Z at System.Threading.Tasks.Task.<>c.<.cctor>b__274_0(Object obj)&#xA;2020-12-25T14:34:01.463781109Z at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)&#xA;2020-12-25T14:34:01.463786509Z --- End of stack trace from previous location where exception was thrown ---&#xA;2020-12-25T14:34:01.463790909Z at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)&#xA;2020-12-25T14:34:01.463795509Z at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)&#xA;2020-12-25T14:34:01.463800009Z --- End of stack trace from previous location where exception was thrown ---&#xA;2020-12-25T14:34:01.463813709Z at Xabe.FFmpeg.FFprobeWrapper.RunProcess(String args, CancellationToken cancellationToken)&#xA;2020-12-25T14:34:01.463818109Z at Xabe.FFmpeg.FFprobeWrapper.GetStreams(String videoPath, CancellationToken cancellationToken)&#xA;2020-12-25T14:34:01.463821909Z at Xabe.FFmpeg.FFprobeWrapper.SetProperties(MediaInfo mediaInfo, CancellationToken cancellationToken)&#xA;2020-12-25T14:34:01.463825509Z at Xabe.FFmpeg.MediaInfo.Get(String filePath, CancellationToken cancellationToken)&#xA;2020-12-25T14:34:01.463829109Z at Xabe.FFmpeg.MediaInfo.Get(String filePath)&#xA;2020-12-25T14:34:01.463832609Z at Xabe.FFmpeg.FFmpeg.GetMediaInfo(String fileName)&#xA;2020-12-25T14:34:01.467009509Z at root2webAPI.Controllers.AzureStorageControllers.BlobExplorerController.GetVideoThumbnailAsync(IFormFile file, Int32 frameTarget) in /src/root2webAPI/Controllers/AzureStorageControllers/BlobExplorerController.cs:line 271&#xA;2020-12-25T14:34:01.467023809Z at root2webAPI.Controllers.AzureStorageControllers.BlobExplorerController.UploadMediaBlob(IFormFile file, String parentId) in /src/root2webAPI/Controllers/AzureStorageControllers/BlobExplorerController.cs:line 96&#xA;2020-12-25T14:34:01.467028709Z at lambda_method(Closure , Object )&#xA;2020-12-25T14:34:01.467032109Z at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult()&#xA;2020-12-25T14:34:01.467035909Z at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)&#xA;2020-12-25T14:34:01.467039409Z at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)&#xA;2020-12-25T14:34:01.467043209Z at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)&#xA;2020-12-25T14:34:01.467055709Z at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)&#xA;2020-12-25T14:34:01.467060609Z at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)&#xA;2020-12-25T14:34:01.467067409Z at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)&#xA;2020-12-25T14:34:01.467071609Z at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)&#xA;2020-12-25T14:34:01.467075209Z at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)&#xA;2020-12-25T14:34:01.467078709Z at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)&#xA;2020-12-25T14:34:01.467089009Z at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)&#xA;2020-12-25T14:34:01.467093409Z at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)&#xA;2020-12-25T14:34:01.467096909Z at Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)&#xA;2020-12-25T14:34:01.467100509Z at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)&#xA;2020-12-25T14:34:01.467103809Z at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext]

    &#xA;

    here is my relevant .net application code

    &#xA;

      private async Task<mediametadata> GetVideoThumbnailAsync(IFormFile file,int frameTarget)&#xA;    {&#xA;     var fileName = file.FileName;&#xA;     var filePath = Path.Combine(_rootPath, "videos", fileName);&#xA;     var fileExtension = Path.GetExtension(filePath);&#xA;     &#xA;     // the xabe wrapper works with only mp4 extension to create thumbnail , if the file is any other format first convert it to&#xA;     //the mp4 format and then goahead with creating the thumbnail.  &#xA;     var thumbnailImageName = fileName.Replace(fileExtension, ".jpg");&#xA;     var thumbnailImagePath = Path.Combine(_rootPath, "thumbnails", thumbnailImageName);&#xA;     &#xA;            using (Stream fileStream = new FileStream(filePath, FileMode.Create)) {&#xA;                &#xA;             await file.CopyToAsync(fileStream);&#xA;            }&#xA;    Console.WriteLine(Path.Combine(_rootPath,"ffmpeg"));&#xA;    FFmpeg.SetExecutablesPath(Path.Combine(_rootPath,"ffmpeg"));&#xA;    IMediaInfo mediaInfo = await FFmpeg.GetMediaInfo(filePath);&#xA;    var videoDuration = mediaInfo.VideoStreams.First().Duration;&#xA;    IConversion conversion = await FFmpeg.Conversions.FromSnippet.Snapshot(filePath, thumbnailImagePath , TimeSpan.FromSeconds(frameTarget));&#xA;    IConversionResult result = await conversion.Start();&#xA;    MediaMetadata media = new MediaMetadata();&#xA;    media.DurationSeconds=Convert.ToInt32(videoDuration.TotalMilliseconds);&#xA;    // media.DurationSeconds=10;&#xA;    media.ThumbnailImagePath= thumbnailImagePath;&#xA;    return media;&#xA;    &#xA;    }&#xA;</mediametadata>

    &#xA;

    could you help me out with this ..many thanks

    &#xA;

  • ffmpeg exit code 429496724 when opening file with {} in name

    16 février, par Holly Wilson

    I'm trying to write a program that will read the names of files in a directory, and parse them for info which it will then write into that file's metadata (seems pointless, I know, but it's more of a trial run for a larger project. If I can figure this out, then I'll be ready to move on to what I actually want to do).&#xA;All of my filenames are formatted :

    &#xA;

    Title, Article* - Subtitle* Cut* [Year]&#xA;*if present

    &#xA;

    The four test videos I'm using are titled :

    &#xA;

    Test Video 1 [2000]

    &#xA;

    Test Video 2, A [2000]

    &#xA;

    Test Video 3 Test Cut [2000]

    &#xA;

    Test Video 4 - The Testening [2000]

    &#xA;

    The code seems to be working fine on videos 1, 2, & 4 ; but video 3 is causing me a lot of headache.

    &#xA;

    //node C:\Users\User\Documents\Coding\Tools\testMDG.js&#xA;const fs = require(&#x27;fs&#x27;);&#xA;const path = require(&#x27;path&#x27;);&#xA;const ffmpeg = require(&#x27;fluent-ffmpeg&#x27;);&#xA;const async = require(&#x27;async&#x27;);&#xA;const directory = path.normalize(&#x27;F:\\Movies &amp; TV\\Movies\\testDir&#x27;);&#xA;let x = 0;&#xA;const fileArray = [];&#xA;const succArray = [];&#xA;const failArray = [];&#xA;// Set the path to the ffmpeg executable&#xA;ffmpeg.setFfmpegPath(path.normalize(&#x27;C:\\ffmpeg\\bin\\ffmpeg.exe&#x27;));&#xA;&#xA;// Add this near the start of your script&#xA;const tempDir = path.join(directory, &#x27;temp&#x27;);&#xA;if (!fs.existsSync(tempDir)) {&#xA;    fs.mkdirSync(tempDir, { recursive: true });&#xA;}&#xA;&#xA;const progresscsv = path.normalize(&#x27;C:\\Users\\User\\Documents\\Coding\\Tools\\progress.csv&#x27;);&#xA;if (fs.existsSync(progresscsv)) {&#xA;    fs.unlinkSync(progresscsv);&#xA;};&#xA;&#xA;const csvStream = fs.createWriteStream(progresscsv);&#xA;csvStream.write(&#x27;File Name,Status\n&#x27;);&#xA;&#xA;const CONCURRENCY_LIMIT = 3; // Adjust based on your system capabilities&#xA;&#xA;// Add at the start of your script&#xA;const processedFiles = new Set();&#xA;&#xA;function sanitizeFilePath(filePath) {&#xA;    return filePath.replace(/([{}])/g, &#x27;\\$1&#x27;);&#xA;}&#xA;&#xA;// Create a queue&#xA;const queue = async.queue(async (task, callback) => {&#xA;    const { file, filePath, tempFilePath, movieMetadata } = task;&#xA;    try {&#xA;        await new Promise((resolve, reject) => {&#xA;            console.log(`ffmpeg reading: ${sanitizeFilePath(filePath)}`);&#xA;            ffmpeg(sanitizeFilePath(filePath))&#xA;                .outputOptions([&#xA;                    &#x27;-y&#x27;,&#xA;                    &#x27;-c&#x27;, &#x27;copy&#x27;,&#xA;                    &#x27;-map&#x27;, &#x27;0&#x27;,&#xA;                    &#x27;-metadata&#x27;, `title=${movieMetadata.title}`,&#xA;                    &#x27;-metadata&#x27;, `subtitle=${movieMetadata.subtitle || &#x27;&#x27;}`,&#xA;                    &#x27;-metadata&#x27;, `comment=${movieMetadata.cut || &#x27;&#x27;}`,&#xA;                    &#x27;-metadata&#x27;, `year=${movieMetadata.year}`&#xA;                ])&#xA;                .on(&#x27;error&#x27;, (err) => reject(err))&#xA;                .on(&#x27;end&#x27;, () => resolve())&#xA;                .saveToFile(tempFilePath);&#xA;        });&#xA;        &#xA;        // Handle success&#xA;        console.log(`Successfully processed: ${file}`);&#xA;        succArray.push(file);&#xA;        // Only call callback once&#xA;        if (callback &amp;&amp; typeof callback === &#x27;function&#x27;) {&#xA;            callback();&#xA;        }&#xA;    } catch (err) {&#xA;        // Handle error&#xA;        console.error(`Error processing ${file}: ${err.message}`);&#xA;        failArray.push(file);&#xA;        // Only call callback once with error&#xA;        if (callback &amp;&amp; typeof callback === &#x27;function&#x27;) {&#xA;            callback(err);&#xA;        }&#xA;    }&#xA;}, CONCURRENCY_LIMIT);&#xA;&#xA;fs.readdir(directory, (err, files) => {&#xA;    if (err) {&#xA;        console.error(`Error reading directory: ${err.message}`);&#xA;        return;&#xA;    }&#xA;    console.log(directory);&#xA;&#xA;    // Filter for files only&#xA;    files = files.filter(file => fs.statSync(path.join(directory, file)).isFile());&#xA;    console.log(files);&#xA;&#xA;    for (const file of files) {&#xA;        x&#x2B;&#x2B;;&#xA;        const filePath = path.join(directory, file);&#xA;        let desort = file.replace(/(.*),\s(the\s|an\s|a\s)/i, &#x27;$2&#x27;&#x2B;&#x27;$1 &#x27;) || file;&#xA;        &#xA;        // Create task object for queue&#xA;        const task = {&#xA;            file,&#xA;            filePath: filePath,&#xA;            tempFilePath: path.join(directory, &#x27;temp&#x27;, `temp_${x}_${path.parse(file).name&#xA;                .replace(/[^a-zA-Z0-9]/g, &#x27;_&#x27;)}${path.extname(file)}`),&#xA;            movieMetadata: {&#xA;                title: desort.replace(/(\s[\-\{\[].*)/gi, ``),&#xA;                subtitle: desort.includes(&#x27;-&#x27;) ? desort.replace(/(.*)\-\s(.*?)[\{\[].*/gi, &#x27;$2&#x27;) : null,&#xA;                cut: desort.includes(&#x27;{&#x27;) ? desort.replace(/.*\{(.*)\}.*/gi, &#x27;$1&#x27;) : null,&#xA;                year: desort.replace(/.*\[(.*)\].*/gi, &#x27;$1&#x27;)&#xA;            }&#xA;        };&#xA;        &#xA;        // Add to processing queue&#xA;        queue.push(task, (err) => {&#xA;            if (!processedFiles.has(task.file)) {&#xA;                processedFiles.add(task.file);&#xA;                if (err) {&#xA;                    csvStream.write(`${task.file},Failed\n`);&#xA;                } else {&#xA;                    csvStream.write(`${task.file},Processed\n`);&#xA;                }&#xA;            }&#xA;        });&#xA;    }&#xA;});&#xA;&#xA;// Add queue completion handler&#xA;queue.drain(() => {&#xA;    console.log(&#x27;All files have been processed&#x27;);&#xA;    console.log(`Success: ${succArray.length} files: ${succArray}`);&#xA;    console.log(`Failed: ${failArray.length} files: ${failArray}`);&#xA;});&#xA;&#xA;//node C:\Users\User\Documents\Coding\Tools\testMDG.js&#xA;

    &#xA;

    And the console is logging :

    &#xA;

    PS C:\Users\User> node C:\Users\User\Documents\Coding\Tools\testMDG.js&#xA;F:\Movies &amp; TV\Movies\testDir&#xA;[&#xA;  &#x27;Test Video 1 [2020].mp4&#x27;,&#xA;  &#x27;Test Video 2, A [2020].mp4&#x27;,&#xA;  &#x27;Test Video 3 {Test Cut} [2020].mp4&#x27;,&#xA;  &#x27;Test Video 4 - The Testening [2020].mp4&#x27;&#xA;]&#xA;ffmpeg reading: F:\Movies &amp; TV\Movies\testDir\Test Video 1 [2020].mp4&#xA;ffmpeg reading: F:\Movies &amp; TV\Movies\testDir\Test Video 2, A [2020].mp4&#xA;ffmpeg reading: F:\Movies &amp; TV\Movies\testDir\Test Video 3 \{Test Cut\} [2020].mp4&#xA;Error processing Test Video 3 {Test Cut} [2020].mp4: ffmpeg exited with code 4294967294: Error opening input file F:\Movies &amp; TV\Movies\testDir\Test Video 3 \{Test Cut\} [2020].mp4.&#xA;Error opening input files: No such file or directory&#xA;&#xA;ffmpeg reading: F:\Movies &amp; TV\Movies\testDir\Test Video 4 - The Testening [2020].mp4&#xA;Successfully processed: Test Video 1 [2020].mp4&#xA;Successfully processed: Test Video 2, A [2020].mp4&#xA;Successfully processed: Test Video 4 - The Testening [2020].mp4&#xA;All files have been processed&#xA;Success: 3 files: Test Video 1 [2020].mp4,Test Video 2, A [2020].mp4,Test Video 4 - The Testening [2020].mp4&#xA;Failed: 1 files: Test Video 3 {Test Cut} [2020].mp4&#xA;

    &#xA;

    I've tried so many different solutions in the sanitizeFilePath function. Escaping the {} characters (as included below), escaping all non-alphanumeric characters, putting the filepath in quotes, etc. VSCode's CoPilot is just pulling me round in circles, suggesting solutions I've already tried.

    &#xA;

  • How to combine multiple video blobs in js without gap ?

    5 septembre 2021, par Pouria Moosavi

    I have an array of urls. I download them with fetch and then get blob from each response with await res.blob(). I need to concat all these blobs together to make a full video out of it, I tried to push each blob into an array and make a file new File(blobArray, "test") but the result has a gap between each blob.

    &#xA;

    I've tried to save each blob as a separate file and concat them with ffmpeg -f concat -safe 0 -i text -c copy out3.mp4 and the result was perfect. So I know that my blobs are correct and the problem is how I am combining them together.

    &#xA;

    This is my full code :

    &#xA;

    (async function() {&#xA;  var urlString = `&#xA;https://hls-c.udemycdn.com/2020-06-25_14-12-40-d54947f66bb66a48d9c119adf45739ad/1/hls/AVC_1920x1080_800k_AAC-HE_64k/aa0003ab30f349f2a87b8a745d2b648e18160.ts?Expires=1630841672&amp;Signature=C-DrIcvmIGkm0s42EQRPWh6Y-aEWvnl2xu1LOIWyzgQqOe-~6E9rLtpR5Kdfz8lNdNXVFz2XyrsgSX1Dn8AUbxUM6umqxALPn57sdSUoVf5-JQce472EHX-roQTsy3SAM~IIXH3B6FHcpdce~1vdqTze~nQY2F3wbzCPyspJSEPU74~-TySj8PhHrFtYNFIsFVr4R-Pc4FF-EWy2zXzo0Av59-4VlOXqFYhmQwcm~kimWNXJpOYhghv6pVbFYzyp7x9tYLiX1~9hbTG3otmoBAJGRt7EUlZiBZhprAgMzhrPS2TezenBKXNf0qJEp-fnC5so0OykRt-TGhyRapbJoA__&amp;Key-Pair-Id=APKAITJV77WS5ZT7262A,&#xA;https://hls-c.udemycdn.com/2020-06-25_14-12-40-d54947f66bb66a48d9c119adf45739ad/1/hls/AVC_1920x1080_800k_AAC-HE_64k/aa0003ab30f349f2a87b8a745d2b648e18161.ts?Expires=1630841672&amp;Signature=bBVrS4brV209hRADZgPnYQICBcXWe6Ed6zwBOFdozjIR1tiuahx3YmPhM8uaxLNRqowALgylen1wQBmdK5bGm~73DQUcUUfGXQU8kIv45CW1DyHDzX-ECR3MDpzSzIYDI8ELbFXK8gmT7ELgtmdkSrL0XO0FXCVAzLrzSw6-0XAZgzBY7tZUncRum5Wb7EhYQgluO2uCquz6HZqaVA9IYoCeFWKFXvU3xE-RBqHXksWkZO01o3UNEEgnzYrRepurcdYY029~6MsHEyj5304pDlefXKrEj8mbZidvhaUKkiIjcoG15jznWPvN3WAewK3zXpLlCYhBMuDL0kOVIq5zjA__&amp;Key-Pair-Id=APKAITJV77WS5ZT7262A,&#xA;https://hls-c.udemycdn.com/2020-06-25_14-12-40-d54947f66bb66a48d9c119adf45739ad/1/hls/AVC_1920x1080_800k_AAC-HE_64k/aa0003ab30f349f2a87b8a745d2b648e18162.ts?Expires=1630841672&amp;Signature=a3lUizMPzmtntrapM9qLk0f~GrfnQAFNlEJEzrvFowGMZVMukqPVfloM7Z9J33ZThK7mKfRy7tiYH1KDzCT5hpRl0X-pcCvcmAmy4u8h1upKO0RJmaP1v7PVzqACPTyvDHNDy3Fh-pxhpO1ubKR2SR7gq1n1K6tX8sbogNHmo0jPnERRxtLKF618nAuGBPQVYofkNG0zvcomGRX7iN95ovn8Ql9IxmqsGLGI2HzlJq3v8L4iS6UYUpV4yhAtZxmbERACq82JcwdiMMlLlnn~SoenYttzDrTdSh-u321KqjAoD6lij6l~j-dReVWY4HTDlsCnGaw9w-eOIuEywi8DpA__&amp;Key-Pair-Id=APKAITJV77WS5ZT7262A,&#xA;https://hls-c.udemycdn.com/2020-06-25_14-12-40-d54947f66bb66a48d9c119adf45739ad/1/hls/AVC_1920x1080_800k_AAC-HE_64k/aa0003ab30f349f2a87b8a745d2b648e18163.ts?Expires=1630841672&amp;Signature=Q6eYIsoPFVKYjY0vVDcnMKKI3oV14xnfDLpvJdH7Z9GoNqojPRXOyITTmd6Ed1JCxmF9oAkfvdghH0Ks1-fSYL3tvu5kMuJe2sWbeKCimqHQ89JvhJ3hOfVvUBIv-QVdbGYXD9FOr8T5s~HYC5KkDrFqRorDidH04y67P175sBXMtYIwt04KzG7m17X8kbJkjsjuVhD0sZ0ewACz1OBPnxO9qLdvGsRqVtW1FmuKSnDULieqdsQGfuH1YkkVCr7H4t0B5SF77vvxYkvcr4uGRjKMPVdggg3BYQKCWHn~pEEP2~P6oJZdfwbu9wnKJnIvimXVleHYW-hPk0OWBD5JAg__&amp;Key-Pair-Id=APKAITJV77WS5ZT7262A,&#xA;https://hls-c.udemycdn.com/2020-06-25_14-12-40-d54947f66bb66a48d9c119adf45739ad/1/hls/AVC_1920x1080_800k_AAC-HE_64k/aa0003ab30f349f2a87b8a745d2b648e18164.ts?Expires=1630841672&amp;Signature=HItA9pW3RiIhf9pFFGm4Y8FmikCPXBfh8gxJVNSLsJ9cuDONLX3n26ZjYO2NaROwsID9YjxwlDuS9jqqe62A7vLPsAjVmL6WvCZ8a22tAihPBPM-qOSWoHS7E~3bSurc9CzkQwlOBvg01~Mjl-E2kvP-hn0FxhTPk1FAE8BrL6DIeGKsBqIdvVgHsJyTi9osDNPG~OtKRKRskAK37QcXidkiLjFMcbX6uqwmcVHEpP30fDj13wBMwx2suuJ27~ICmSH44CHCuRcKujISKbrVjbnsUw4ivA7a72hyybSTDhwZBzjj753FFy0LqSVWVFOJJY1HXEnZ4mpvax9N1lth2Q__&amp;Key-Pair-Id=APKAITJV77WS5ZT7262A,&#xA;https://hls-c.udemycdn.com/2020-06-25_14-12-40-d54947f66bb66a48d9c119adf45739ad/1/hls/AVC_1920x1080_800k_AAC-HE_64k/aa0003ab30f349f2a87b8a745d2b648e18165.ts?Expires=1630841672&amp;Signature=L4T1BtTtHVM7p2JqvXEXLcJDUNdm8IZ8LU-oPkKxYBwuZHXEdxOLTTrFSX-3N39c7JMWDljWNi2bLrjbjK2xa1yMB5eTjvZTjusJDPk91RW0cMB4qsTpuXR1ui~ybPe5ABoV6N4cUXj~bUQFfUURo66kH5UdC~SIKMzQx59mnATvKZfZwOizm2kEuc8qaXPi9yJmYdPGhr6qSN1~kl0NEWciOU3o-etMtFc29yrlGl~Fgj0bvCyAwLwtR4yQwKFHCJWZPiMfJky9GJB4LKcyKBFu7bkDjk2BzOveJklvIPF~tZKkd3ki~I5kfYhTL-~hEDT4i9hIfHJEF1JF1rf~bw__&amp;Key-Pair-Id=APKAITJV77WS5ZT7262A,&#xA;https://hls-c.udemycdn.com/2020-06-25_14-12-40-d54947f66bb66a48d9c119adf45739ad/1/hls/AVC_1920x1080_800k_AAC-HE_64k/aa0003ab30f349f2a87b8a745d2b648e18166.ts?Expires=1630841672&amp;Signature=Kzf38iYJwebZG2nzkrPSVEvqWxSc959XcvUqiMhZC1lFwZefNTMw1a5EHcUfObujy~3XQ3Yxm-Ls8CziLLvO3Vi8wEg05GB1COnFT1hxasQHID1tmMaXrKrRBZp2XZApehhOpSroJdx46Zb8qlM4JMu3lf30eBIHsbPOIsdmW1o2E9USZUMUKiG-T3feO1kjT3scDsoKcaX2cQrqE8c1oAuEy57eASgFKQcy0OGtrxDujPHLNWYmRv~CFZxHf8LCuMKBrL9OtXE7py0g9x4d4BvwzQ5XOoQ5d5JsfnT8EeH5Lqbh8crtauJb5BrUk6j9uV1MWviZi7WQzGcds6eItg__&amp;Key-Pair-Id=APKAITJV77WS5ZT7262A,&#xA;https://hls-c.udemycdn.com/2020-06-25_14-12-40-d54947f66bb66a48d9c119adf45739ad/1/hls/AVC_1920x1080_800k_AAC-HE_64k/aa0003ab30f349f2a87b8a745d2b648e18167.ts?Expires=1630841672&amp;Signature=Vc5mVh~J-WEG2eHhiXnsNFBI~kpCtTnwwgiihaP6Fvm1IeA7eJ0QzA5g2Tq1VADLI-B2Bl1Ss~CmSyyXQEiM~IxRVjiNs1~PpnIKm0gFD0iBgIZOS3GoS6bx4bkRiy1tEMn98~~1VGqZ4FxJxc59QOdjmwvAvUvGN01zojOHt0i61XDqjeLz~wFUR9MVh~QYskV4w5sR~THYpKqiMej6JAIVz3avhadVlE1p0P9Gel7LLo59WjFx3Da1huQzBNQ2B8l3-pQpepwbiI0vsrN09aZHLnVtu1NPeEbpG5lZMIhYLay5qQTg1d87ouDoZ8zWYl0buPu5ZL06DiBFIDDhrA__&amp;Key-Pair-Id=APKAITJV77WS5ZT7262A,&#xA;https://hls-c.udemycdn.com/2020-06-25_14-12-40-d54947f66bb66a48d9c119adf45739ad/1/hls/AVC_1920x1080_800k_AAC-HE_64k/aa0003ab30f349f2a87b8a745d2b648e18168.ts?Expires=1630841672&amp;Signature=QsdnxTFnRVml4yq~cbIMRDdESRoX6KH2AkCCm5J-MqW3QEr9RQU5Y7v41nKxIo~IgwI9FMoTRSk61whNyrLePlw2GXq38iK6UhlmpMkJYF3Tvj84GDckbpdqrIQLlZRJPngjx9n2eE3R8Sb7igXwIrr5dymYjEh2Hb0jkYs0~9Zfzr-pJAGoEdUr36hkGP2UXP4n~atb1cDW1hDbd8YJeUNYfKfTSPwq5~E9Te9P674pL2D~WutSM-Gk9xXMhVX7Z0VJWKQh5JWzSkrzDTc9rjTnotWJ7~kU1HqapqD2eVr3DOwI2b19Yv7FGWD3wrxtLA9A8AhkEbpaHLcuYyIS9w__&amp;Key-Pair-Id=APKAITJV77WS5ZT7262A,&#xA;https://hls-c.udemycdn.com/2020-06-25_14-12-40-d54947f66bb66a48d9c119adf45739ad/1/hls/AVC_1920x1080_800k_AAC-HE_64k/aa0003ab30f349f2a87b8a745d2b648e18169.ts?Expires=1630841672&amp;Signature=e-uHBmY7DMqAkrpRbtfyiRlglUU9wwLY5d2Oar44~xgQerrV~5dAa7q~Nf3V2WNyi22Bg88f4bvjYMIPMjghT4aZol7JXv1Q7VH~1xjydJfaIEXunOZzqswi4PbljlXui7W0c2c59hj~6c96bc6Iyr79x3bvylA1nnxJo2Y6a1Zus0irS7u-45BjXym27NtXrhOwpcVc2GNXhI74yqjXA-vFr1XVuHBHMQVMLTryYlStwoAUXnn7K~U88skq0ursQqpDFCmlDkgoXED~rdm7THJht9wOhkFbf2T79xsENBhPoiS56DLT7qIemBFGDUxHVeoTgZdMLXE2SVsgp-LBmQ__&amp;Key-Pair-Id=APKAITJV77WS5ZT7262A,&#xA;https://hls-c.udemycdn.com/2020-06-25_14-12-40-d54947f66bb66a48d9c119adf45739ad/1/hls/AVC_1920x1080_800k_AAC-HE_64k/aa0003ab30f349f2a87b8a745d2b648e181610.ts?Expires=1630841672&amp;Signature=KFxUkMZhteXsl3mSobA5Xg5~PQIztGtmgd~E1g2peja~oHMPNUWE6ihhcOEkO1M6CKXDycegq9~8xv6GqWSrRz5xntTYXNWyRT2-C0W2E79E0Fd1QLndb1~UP1uq~6z-8FbxXLIhHgCzSgaVtPxt8vFqQ1TI-Zd0j0ramKvfWu4iZiZTxEWn5d5Iaaf-LqTdgXWUKqWsr6F0czH7FZh6sI4NVmUAOOD1-sez5ALVr8GBruihB23W5E2yOWtk31KTC-M7TVf1AjwQTJurm~rWka4~~c2lCJ~~o-n~N5p38KdaReZWk2yCqHRYt7pdwpyqIAhosvsVs8Kf5AT2mQV-tQ__&amp;Key-Pair-Id=APKAITJV77WS5ZT7262A,&#xA;https://hls-c.udemycdn.com/2020-06-25_14-12-40-d54947f66bb66a48d9c119adf45739ad/1/hls/AVC_1920x1080_800k_AAC-HE_64k/aa0003ab30f349f2a87b8a745d2b648e181611.ts?Expires=1630841672&amp;Signature=AZuneobcwantsOflRrRO4DJzmW0JzqOcDDrB8YKIh~YbL5AuhlZV2OyN6fgUJ0~EVAqRk4h2RpUmZiD4ov8muNu3U-SHp1ksHia3d8cct7Ns485ta87Lb6GqX9yvF3qTNCTT3f5FSQeoKPmGXWPpbzUsdC7TGxNVy8M5IcdqHeoJDrOUeYOqnyQtNDrhWzFsp14YL4RqWBoiz0llpN6w-8QfaeWzCYkT~KxM0UKlPFDzeijXcNJS-tjCxUrT9CnYZ3IfMDvufDCfztd20x37rK1xSln~fuF4PLsMdrfpayY1lSPMgmLP9-~k7SiYth4qSU4CsdgY~1HTZJpUHg2AXQ__&amp;Key-Pair-Id=APKAITJV77WS5ZT7262A,&#xA;https://hls-c.udemycdn.com/2020-06-25_14-12-40-d54947f66bb66a48d9c119adf45739ad/1/hls/AVC_1920x1080_800k_AAC-HE_64k/aa0003ab30f349f2a87b8a745d2b648e181612.ts?Expires=1630841672&amp;Signature=Dcl1pJwVlfyN-Lqlq8RruR4t4c3l6Y~hSXPdZyLcspdg16gH-Jk78buQCD2LEniYF6xgXRVRgdLQj26lxiHJi2LiHXHV8~jKQVVrU2lnga9p48M35KdJZheJ~N6f91hsTpHEhYBBSR0TYhRcTMrh1WXstOMW5kHA01nVzq3mOpnHlDFpcHNuTslTAAouqeMXsdY6H4ta15puQcVnvqchOr-7c5dU4ZG14FtHF2WvjnMEWARWDvivOvoqQAqwPQgHm5SxJFw~qyZmIeRUG-TT9i-RXIAzSivg6vKiP2A-AomTOwGW3oFRXKLdMXSMlcd6lmQ7~b7jTi7uNX4Bhup-jQ__&amp;Key-Pair-Id=APKAITJV77WS5ZT7262A,&#xA;`&#xA;&#xA;  const urlArr = urlString.split(",")&#xA;  let blobArr = [];&#xA;  for(let url of urlArr) {&#xA;    if(url) {&#xA;      try{&#xA;        const res = await fetch(url);&#xA;        const blob = await res.blob();&#xA;        blobArr.push(blob)&#xA;      } catch (err) {&#xA;        console.log(err)&#xA;      }&#xA;    }&#xA;  }&#xA;&#xA;  const newBlob = new Blob(blobArr)&#xA;  const finalFile = new File([newBlob], "test-udemy");&#xA;  const a = document.createElement("a")&#xA;  const url = URL.createObjectURL(finalFile);&#xA;  a.href = url;&#xA;  a.download = "test-udemy";&#xA;  document.body.appendChild(a);&#xA;  a.click();&#xA;  setTimeout(function() {&#xA;      document.body.removeChild(a);&#xA;      window.URL.revokeObjectURL(url);  &#xA;  }, 0); &#xA;})()&#xA;

    &#xA;

    Unfortunately links will expire soon but I think it is obvious what I am trying to do.

    &#xA;

    So Is there any way to cancat blobs in JS and create the entire video smoothly like the ffmpeg does ?

    &#xA;

    Thanks in advance.

    &#xA;