Convert FLV to MP4 — Free Online Tool
Convert FLV (Flash Video) files to MP4 using H.264 video and AAC audio — the same codecs already used inside most FLV files, making this a highly efficient transcode that preserves quality while producing a universally playable container. MP4 replaces the obsolete Flash-dependent FLV format with a file that works natively on every modern device, browser, and platform without any plugin.
to
FFmpeg Command
Copy this command to run the same conversion locally with FFmpeg on your desktop. Download FFmpeg
Drop your FLV file here
or click to browse
Free — no uploads, no signups. Your files never leave your browser.
Settings
Note: Browser-based encoding uses approximate quality targets. For precise CRF compression, copy the FFmpeg command above and run it on your desktop.
Estimated output:
Conversion Complete!
DownloadHow It Works
Most FLV files already contain H.264 video and AAC audio streams — the same codecs targeted in the output MP4. Despite this codec overlap, FFmpeg re-encodes the video using libx264 and the audio using the AAC encoder rather than simply remuxing (stream-copying) the data. This is because FLV and MP4 differ in how they structure and timestamp streams internally, and a raw remux can produce sync issues or incompatible bitstream headers. The re-encode uses CRF 23 for video (a perceptually transparent quality level for most content) and 128k CBR for audio. The critical addition is the -movflags +faststart flag, which relocates the MP4 metadata (the 'moov atom') to the beginning of the file — essential for web streaming and browser playback, since without it the entire file must download before playback can begin.
What Each Flag Does
| Flag | What it does |
|---|---|
ffmpeg
|
Invokes the FFmpeg binary. When running this conversion in the browser, FFmpeg.wasm executes this command entirely locally via WebAssembly — no data leaves your machine. |
-i input.flv
|
Specifies the input Flash Video file. FFmpeg will auto-detect the FLV container and probe the internal video codec (which may be Sorenson Spark, VP6, or H.264) and audio codec (MP3 or AAC) to determine how to handle each stream. |
-c:v libx264
|
Re-encodes the video stream using the libx264 encoder, producing H.264 video in the output MP4. This is necessary even if the source FLV already contains H.264, because FLV and MP4 differ in their internal bitstream framing (Annex B vs. AVCC format) and timestamp structures. |
-c:a aac
|
Encodes the audio stream using FFmpeg's built-in AAC encoder. If the source FLV uses MP3 audio, this transcodes it to AAC for maximum compatibility with MP4 players. If the source already uses AAC, this re-encodes it to ensure clean, standard-compliant AAC inside the MP4 container. |
-crf 23
|
Sets the Constant Rate Factor for the libx264 video encode to 23, which is the default 'perceptually good' quality level. For typical FLV content (web video, screen recordings, old streams), this produces a visually equivalent result with an efficient file size. |
-b:a 128k
|
Sets the AAC audio bitrate to 128 kilobits per second, which is the standard quality level for stereo web audio and matches the typical audio bitrate found in most FLV files. Increase to 192k or 256k if the source FLV contains high-quality music or if audio fidelity is a priority. |
-movflags +faststart
|
Moves the MP4 moov atom (the metadata index that maps every frame's position in the file) from the end of the file to the beginning after encoding completes. This is essential for web streaming and browser playback of the converted file, and mirrors the original FLV's design intent as a streaming-first format. |
output.mp4
|
The output filename. The .mp4 extension tells FFmpeg to write an MPEG-4 Part 14 container, which will hold the H.264 video stream, AAC audio stream, and the faststart-optimized moov atom produced by this command. |
Common Use Cases
- Recovering old Flash video downloads (recorded lectures, archived streams, tutorial videos) that can no longer play in any modern browser since Flash was discontinued in 2020
- Uploading archived FLV content to YouTube, Vimeo, or social media platforms that reject FLV but accept MP4 natively
- Editing legacy FLV footage in video editors like Premiere Pro, DaVinci Resolve, or Final Cut Pro, which have dropped or limited FLV support
- Preparing FLV recordings from older screen-capture or game-recording software (like Fraps or older OBS versions) for long-term archival in a non-obsolete container
- Embedding video on a website or serving it via a video player like Video.js or Plyr, which expect MP4 with faststart rather than FLV
- Converting FLV files downloaded from old web archives or Wayback Machine captures so they can be played on smartphones and smart TVs without Flash support
Frequently Asked Questions
Yes, there will be a small quality loss because the video is re-encoded rather than stream-copied. Even at CRF 23, re-encoding H.264 to H.264 introduces a generation loss — it is not a lossless copy. For most FLV content the difference is imperceptible, but if you need to preserve the exact original bitstream, you would need to use '-c:v copy -c:a copy' in FFmpeg directly, which works only when the FLV's internal codec headers are MP4-compatible. The tool uses re-encoding by default to ensure compatibility across all FLV variants, including those with the older Sorenson Spark (FLV1) video codec.
Older FLV files — particularly those from pre-2008 Flash video workflows — often use Sorenson Spark (codec tag FLV1) or On2 VP6, neither of which is supported inside an MP4 container. The FFmpeg command on this tool re-encodes everything to libx264 and AAC, so it handles these legacy codecs correctly regardless of the original FLV video codec. This is actually one of the key reasons a re-encode is preferable to a simple remux for FLV-to-MP4 conversions.
MP4 files store a metadata block called the 'moov atom' that tells a player where every frame is located in the file. By default, FFmpeg writes this block at the end of the file after encoding is complete. For web streaming or browser playback, this means the entire file must download before it can start playing. The -movflags +faststart flag instructs FFmpeg to move the moov atom to the beginning of the file in a post-processing step, enabling progressive download and immediate playback — especially important for converted FLV content that was originally designed for streaming delivery.
Change the CRF value in the command — the default is 23, where lower numbers mean higher quality and larger files, and higher numbers mean lower quality and smaller files. For archiving old FLV content where quality matters, CRF 18 is considered visually near-lossless. For web delivery or sharing where file size is a priority, CRF 28–30 produces significantly smaller files with acceptable quality for most content. For example: 'ffmpeg -i input.flv -c:v libx264 -c:a aac -crf 28 -b:a 128k -movflags +faststart output.mp4'.
Yes. On Linux or macOS, you can loop over all FLV files in a directory with: 'for f in *.flv; do ffmpeg -i "$f" -c:v libx264 -c:a aac -crf 23 -b:a 128k -movflags +faststart "${f%.flv}.mp4"; done'. On Windows Command Prompt, use: 'for %f in (*.flv) do ffmpeg -i "%f" -c:v libx264 -c:a aac -crf 23 -b:a 128k -movflags +faststart "%~nf.mp4"'. The in-browser tool processes one file at a time, so the FFmpeg command is particularly valuable for batch conversions of large FLV archives.
FLV does not support subtitle tracks or chapter markers, so there is nothing to carry over from the source file. However, MP4 does support both features, meaning you can add subtitles or chapters to the output after conversion using separate FFmpeg commands. For example, you can mux in an SRT subtitle file with '-i subtitles.srt -c:s mov_text' in a subsequent step. The conversion itself simply produces a clean MP4 with the video and audio from the original FLV.
Technical Notes
FLV is a container format that was dominant for web video from roughly 2003 to 2015, relying entirely on Adobe Flash Player for playback. It supports three generations of video codecs: Sorenson Spark (H.263-derived, codec tag FLV1), On2 VP6, and H.264 (added in Flash Player 9). Audio codecs include MP3, AAC, and older formats like ADPCM and Nellymoser. Because MP4 only natively supports H.264/H.265/VP9 video and AAC/MP3/Opus audio, FLV files using Sorenson Spark or VP6 must be re-encoded — they cannot be remuxed. The re-encode to libx264 at CRF 23 is generally safe for all FLV variants. One known limitation: FLV files sometimes have imprecise or variable timestamps that can cause minor audio-video sync drift; FFmpeg handles this reasonably well but very old or malformed FLV files may require the '-fflags +genpts' flag to regenerate presentation timestamps. The output MP4 does not preserve FLV-specific metadata such as onMetaData event tags (which store duration, framerate, and dimensions as Flash ActionScript objects), but standard duration and stream metadata are correctly written into the MP4 container headers.