3

レベル情報が間違っている 1000 以上のビデオがあるため、一部のデバイスで再生できません。これらは、mp4 コンテナー内の aac オーディオを含む H.264 ベースラインです。それらを修正したいが、再エンコードは避けたい。これが可能であり、より高速になると仮定するのは正しいですか? ストリーム内の level_idc ビットを特定するにはどうすればよいですか? すべてのストリームで同じ場所に配置されますか? これはストリーム内の 1 か所だけであると予想していますが、この仮定は正しいですか? 更新:これを行うと主張するWindows実行可能リンクに出くわしました。UNIXでこのコマンドラインを実行できるようにしたいので、スクリプトを作成できます。

その他の更新: 以下の Roman の回答によると。MP4 構文を掘り下げたところ、プロファイルとレベルの情報が のavcCアトムの一部であることがわかりましたstsd。レベルが になっているのがわかった1Eので、 に修正しました1F。前:61 76 63 43 01 42 C0 1E FF E1 00 19 67 42 C0 1E D9 後:61 76 63 43 01 42 C0 1F FF E1 00 19 67 42 C0 1E D9これにより、MediaInfo は次のように変更されました。

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 

レベル付きの多重化モード パラメータが導入されましたが、残念ながら3.1、このストリームはデバイスでも再生されませんでした。Format ProfileIs this possible without re-encoding? に示されているレベルを修正するにはどうすればよいですか?

4

2 に答える 2

1

レベルはフォーマット記述子にあり、ペイロード自体にも重複している可能性があることに注意してください。記述子自体とペイロード/エンコーディングの実際の整合性を気にしない場合 (レベルを上げるのは問題ないと思いますが、下げるのは問題ないかもしれません)、ビデオを再エンコードせずにレベルを変更することができます。

それ以上 ビデオトラック記述子を保持するボックスを見つけて、そこにレベルをパッチすることで、両方の方法でそれを行うことができます.プレーンコードから。

または、途中でフォーマットを変更してトラックを再多重化する必要があります。デマルチプレクサーとマルチプレクサーは、このレベル値が許容できるかどうかを確認するチェックを行わないため、FFmpeg を使用した再多重化の一部としてパッチを適用することができます。再エンコードせずに MP4 への書き込みを行うサンプル FFmpeg コードは、良い出発点になります (あなたのタスクは、 をextradata開く前に fieldが指すバイト配列を更新することAVFormatContextです)。

于 2013-03-20T09:59:25.153 に答える
1

私は解決策を見つけました。これを理解するのを手伝ってくれた@Romanに大きな功績があります。ビットストリームでavcC アトムの後にプロファイルとレベルを見つけます。mp4私の場合、これは42 C0 1EBaseline@L3.0 でした。レベルを にしたかったのです3.1。これを行うに42 C0 1Eは、ストリーム内の のすべての出現を見つけて に置き換え1Eます1F。私はそのような出来事を約8〜10回見つけました。これで、Baseline@L3.1 が作成されました。これは、 を使用して確認できますmediainfo。h.264 は一連のパケットとしてエンコードされ、それぞれにプロファイルとレベル情報を含む SPS ヘッダーがあるため、これが必要だと思います。

于 2013-03-22T11:28:29.940 に答える