10

I'm working on an application where users upload a video and play it back the browser using jwplayer, jplayer, flowplayer, etc. Some videos play immediately, while others wait until the entire video file has been downloaded.

I'm using ffmpeg to convert the video to mp4 format.

Here is some detailed information about one of the video files I tried.

General
Complete name                    : 429183132058337290450_AutoFF.mp4
Format                           : MPEG-4
Format profile                   : Base Media
Codec ID                         : isom
File size                        : 10.2 MiB
Duration                         : 24s 333ms
Overall bit rate                 : 3 501 Kbps

Video
ID                               : 1
Format                           : AVC
Format/Info                      : Advanced Video Codec
Format profile                   : High@L4.1
Format settings, CABAC           : Yes
Format settings, ReFrames        : 3 frames
Codec ID                         : avc1
Codec ID/Info                    : Advanced Video Coding
Duration                         : 24s 333ms
Bit rate mode                    : Variable
Bit rate                         : 3 351 Kbps
Width                            : 1 024 pixels
Height                           : 560 pixels
Display aspect ratio             : 16:9
Frame rate mode                  : Constant
Frame rate                       : 30.000 fps
Color space                      : YUV
Chroma subsampling               : 4:2:0
Bit depth                        : 8 bits
Scan type                        : Progressive
Bits/(Pixel*Frame)               : 0.195
Stream size                      : 9.72 MiB (96%)
Language                         : Japanese
Rowan Parker
  • 794
  • 2
  • 7
  • 18
Sujeet
  • 1,780
  • 3
  • 16
  • 33

3 Answers3

13

Use ffmpeg with the -movflags +faststart option. This will relocate the moov atom to the beginning of the file, thus allowing playback to begin by the client without the need to completely download the file first.

You can use it in your encoding command, or you can use it with an existing file and simply re-mux:

ffmpeg -i input.mp4 -c copy -movflags +faststart output.mp4
llogan
  • 121,796
  • 28
  • 232
  • 243
8

I had this problem with some MP4 videos as well. I was converting uploaded videos to mp4 (h.264 + aac) and they wouldn't buffer. The reason is that this format contains some important metadata required for the playback at the end of the file, hence the entire file has to be loaded before the playback can start. The solution was to use a tiny program called qt-faststart (https://github.com/danielgtaylor/qtfaststart) on the result of the conversion. This program relocates this metadata to the beginning of the file making progressive-download playback possible.

Aleks G
  • 56,435
  • 29
  • 168
  • 265
2

I had this same problem for the longest time when using ffmpeg to create MP4 videos - what eventually worked, was simply adding preload="metadata" to the html5 tag:

<video preload="metadata"><source src="..." /></video>
velocityhead
  • 172
  • 7