28

I have a movie (m4v/h.264/AAC) which plays fine on my Mac but I recently discovered that it wont play on my Apple TV3. After looking at the properties of this movie file I see that it has a profile High@4.1 but Apple TV3's only suport up to High@4.0. I think the only property that is making this video incompatible is the max video bit rate, all of the other properties look like they are supported in High@4.0.

How can I use ffmpeg to downgrade this video to High@4.0?

Or do I have to instead change the actual property (max bit rate) that makes this video 4.1 instead of 4.0? I am worried that if I just change the bit rate, although the file would then be compatible with High@4.0 it would still be 'tagged' as High@4.1 and therefore still wouldn't play on my Apple TV3.

39

When encoding with libx264, you can set the H.264 profile and level with:

  • -profile:v – one of high, main, or baseline (and others, but this is irrelevant here)
  • -level:v – as defined in Annex A of the H.264 standard, e.g., 4.0.

For example:

ffmpeg -i input.mp4 -c:v libx264 -profile:v high -level:v 4.0 -c:a copy output.mp4

Here we've just copied the audio stream since it won't be affected.

The output will have the correct profile and level set in its metadata. You can check this while encoding, where x264 says something like:

[libx264 @ 0x7fb26103a000] profile High, level 4.0

MediaInfo can also help you analyze container and codec details.

Of course, reencoding the video will degrade its quality to some extent, given that you're applying a lossy conversion again. Try setting the -crf option to influence the constant quality parameter. The default value here is 23, while values between 18 and 28 are considered sane. Lower means better quality. If your input has a bit rate of up to 65,000 kBit/s, chances are it'll still look pretty good after conversion though.

11
  • 1
    That worked well. Unfortunately it lost some of the metadata but the actual video didn't have any noticeable change in quality. Out of interest, would the following command have achieved the same thing? ffmpeg -i input.mp4 -vcodec x264 -vprofile high -vlevel 4.0 -acodec copy output.mp4
    – Sam
    Mar 13 '13 at 6:47
  • Yes, the -v options are aliases of the :v ones. What metadata did you lose?
    – slhck
    Mar 13 '13 at 19:47
  • I think it might have just been the artwork that was lost. I don't know if that is technically considered metadata... Is the artwork actually contained within the file? I didn't check everything else before I added the whole to it again.
    – Sam
    Mar 14 '13 at 6:10
  • 2
    I just stumbled upon a way to achieve this. Subler actually has an option, when you select the video stream, to change the profile and level to make it compatible with certain devices. It tells you to make sure that the video is compatible wit the profile you are setting so I don't think it does any re-encoding, it must just change the metadata.
    – Sam
    Jul 30 '13 at 10:04
  • 1
    To avoid losing metadata (and additionally don't lose the other tracks, audio or subtitles), add -map 0.
    – cdlvcdlv
    Apr 17 '18 at 10:55
1

In reference to your comment, try this command:

ffmpeg -i input.mp4 -map 1 -c:v libx264 -profile:v high -level:v 4.0 -c:a copy \
# copies all global metadata from input.mp4 to output.mp4
-map_metadata 0 \
# copies video stream metadata from input.mp4 to output.mp4
-map_metadata:s:v 0:s:v \
# copies audio stream metadata from input.mp4 to output.mp4
-map_metadata:s:a 0:s:a \
output.mp4

Cheers

0

Although I have read otherwise (ie different input formats) I used " -movflags use_metadata_flag" when reencoding from x265 to x264 and it worked!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.