Skip to main content

Download and Parse Videos or Audio simultaneously

@remotion/media-parser allows you to download a remote video to disk, and while the media is downloading, retrieve metadata from it as soon as it is available.

Here is an example using the downloadAndParseMedia() API:

import {downloadAndParseMedia} from '@remotion/media-parser';
import {nodeWriter} from '@remotion/media-parser/node-writer';

const {durationInSeconds, tracks} = await downloadAndParseMedia({
  src: 'https://s3.amazonaws.com/bucket/uploaded-asset.mp4',
  writer: nodeWriter('output.mp4'),
  fields: {
    durationInSeconds: true,
    tracks: true,
  },
});
// If here was reached, file is downloaded!
console.log(durationInSeconds);
console.log(tracks);

You can use callback functions to retrieve information as soon as it is available.
Throw an error to stop the download.

import {downloadAndParseMedia} from '@remotion/media-parser';
import {nodeWriter} from '@remotion/media-parser/node-writer';

await downloadAndParseMedia({
  src: 'https://s3.amazonaws.com/bucket/uploaded-asset.mp4',
  writer: nodeWriter('output.mp4'),
  onDurationInSeconds: (duration) => {
    if (duration && duration > 600) {
      throw new Error('Video is too long');
    }
  },
});

If an error occurs (including one you've thrown yourself), you can decide what to do using onError.

import {downloadAndParseMedia} from '@remotion/media-parser';
import {nodeWriter} from '@remotion/media-parser/node-writer';

await downloadAndParseMedia({
  src: 'https://s3.amazonaws.com/bucket/uploaded-asset.mp4',
  writer: nodeWriter('output.mp4'),
  onError: (error) => {
    // Force the file to be downloaded despite parsing error.
    // Note: At the end, the error will be thrown nonetheless.
    return {action: 'download'};

    // Default behavior:
    // Abort the download, delete the file and throw the error immediately.
    // return {action: 'fail'};
  },
});

See also