Recherche avancée

Médias (1)

Mot : - Tags -/illustrator

Autres articles (95)

  • Personnaliser en ajoutant son logo, sa bannière ou son image de fond

    5 septembre 2013, par

    Certains thèmes prennent en compte trois éléments de personnalisation : l’ajout d’un logo ; l’ajout d’une bannière l’ajout d’une image de fond ;

  • Ecrire une actualité

    21 juin 2013, par

    Présentez les changements dans votre MédiaSPIP ou les actualités de vos projets sur votre MédiaSPIP grâce à la rubrique actualités.
    Dans le thème par défaut spipeo de MédiaSPIP, les actualités sont affichées en bas de la page principale sous les éditoriaux.
    Vous pouvez personnaliser le formulaire de création d’une actualité.
    Formulaire de création d’une actualité Dans le cas d’un document de type actualité, les champs proposés par défaut sont : Date de publication ( personnaliser la date de publication ) (...)

  • Le profil des utilisateurs

    12 avril 2011, par

    Chaque utilisateur dispose d’une page de profil lui permettant de modifier ses informations personnelle. Dans le menu de haut de page par défaut, un élément de menu est automatiquement créé à l’initialisation de MediaSPIP, visible uniquement si le visiteur est identifié sur le site.
    L’utilisateur a accès à la modification de profil depuis sa page auteur, un lien dans la navigation "Modifier votre profil" est (...)

Sur d’autres sites (12414)

  • 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;