Search code examples
videoffmpegmp4

FFMPEG video conversion to MP4 works everywhere except in iOS Safari/Chrome


I use the following code to convert .webm videos to .mp4 using the FFMPEG library:

ffmpeg -i video.webm -vcodec h264 -acodec aac -strict experimental video.mp4

This works flawless when playing the converted video in Windows (Chrome/Firefox), Mac (Safari/Chrome), Android (Chrome) but it does not work when watching through iOS (Safari/Chrome).

At first I thought it might be an mp4 problem? But then I played without any problems in my iOS Safari this video https://www.w3schools.com/html/mov_bbb.mp4 which is also a mp4.

So this tells me that something is not quite right about the conversion.

What am I missing in the conversion?

Log from PuTTy: https://pastebin.com/VLSPL0nC


Solution

    1. Your ffmpeg is ancient. Download or compile a new version.
    2. Remove -strict experimental (that's only needed for really old builds).
    3. Add -movflags +faststart so it can begin playback faster.
    4. Add -vf format=yuv420p for a compatible pixel format.
    5. Output AAC audio (-c:a aac) instead of MP3 (-c:a libmp3lame).
    6. If it still fails it may be due to the device not supporting High profile. Add -profile:v main. You don't need to add this if your device supports High profile.

    Example:

    ffmpeg -i input -c:v libx264 -profile:v main -vf format=yuv420p -c:a aac -movflags +faststart output.mp4
    
    • Refer to the specifications of your target device to determine the appropriate -profile:v (and possibly -level).

    • See FFmpeg Wiki: H.264 for more info.