title: Modify H.264 Level in MP4 stream
body: <p>I have 1000+ videos with wrong Level information, and hence do not play on some devices. They are H.264 baseline with aac audio in mp4 container. I want to correct them but avoid re-encoding. Am I right in assuming that this is possible and will be faster? How do I identify the level_idc bits in the streams? Will all streams have them in the same location? I expect this to be in just one place in the stream, is this assumption correct?
  Update: I came across a windows executable <a href="http://www.videohelp.com/tools/H264-AVC-Level-Editor" rel="nofollow">link</a> that claims to do this. I want to be able to do this commandline on unix, so I can script it.</p>
  
  <p>More Updates: As per Roman's answer below. I dug up MP4 syntax and found that Profile and Level information are part of <code>avcC</code> atom under <code>stsd</code>. I could see that level was set to <code>1E</code>, I corrected it to <code>1F</code>. Before: <code>61 76 63 43 01 42 C0 1E FF E1 00 19 67 42 C0 1E
  D9</code>
  After: <code>61 76 63 43 01 42 C0 1F FF E1 00 19 67 42 C0 1E
  D9</code> with that the MediaInfo changed to: </p>
  
  <pre><code>Video
  ID                                       : 1
  Format                                   : AVC
  Format/Info                              : Advanced Video Codec
  Format profile                           : Baseline@L3.0
  Format settings, CABAC                   : No
  Format settings, ReFrames                : 3 frames
  Muxing mode                              : Container profile=Baseline@3.1
  Codec ID                                 : avc1
  Codec ID/Info                            : Advanced Video Coding
  Duration                                 : 1mn 4s
  Bit rate                                 : 3 000 Kbps
  Width                                    : 1 280 pixels
  Height                                   : 720 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.109
  Stream size                              : 22.7 MiB (92%)
  Writing library                          : x264 core 120 r2151 a3f4407
  Encoding settings                        : cabac=0 / ref=3 / deblock=1:0:0 / analyse=0x1:0x111 / me=hex / subme=7 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=0 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=12 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=0 / weightp=0 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=40 / rc=abr / mbtree=1 / bitrate=3000 / ratetol=1.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00 
  </code></pre>
  
  <p>It introduced a Muxing mode parameter with level <code>3.1</code> but alas this stream did not play on the device either. How do I correct the level indicated in <code>Format Profile</code> Is this possible without re-encoding?</p>