解決Bento4的mp4hls錯誤ERROR: No JSON object could be decoded

使用mp4hls生成HLS串流遭遇的錯誤

mp4hls -f -o bento4_hls_clear \
  --master-playlist-name=clear.m3u8 \
  --media-playlist-name=track.m3u8 \
  --iframe-playlist-name=ifr.m3u8 \
  fragmented.mp4

Parsing media file fragmented.mp4
ERROR: No JSON object could be decoded

mp4hls生成的這個錯誤是由於python轉換json object失敗造成的
media_info['info'] = json.loads(json_info, strict=False)
根本原因是官網所提供下載的版本,使用mp42hls二進位檔回傳的frame rate參數, 在某些影片中無法得到正常數值所造成的。

解法1. 從github下載新版本,並自行編譯

新版本不再使用frame rate產生HLS, 所以不會造成此問題,已測試過以下版本編譯後無此問題
commit d21c2443691f80e71424aacbb2118c79aead0ad6 (origin/master, origin/HEAD)
Author: Gilles Boccon-Gibod
Date:   Wed Jan 29 04:09:46 2020 +0200

    Add support for CMake/NDK

解法2. 暫行解法

在Bento4的目錄找到mp4-hls.py,在問題行的前面加入2行
加入2行:
json_info = json_info.replace('-nan','NaN')
json_info = json_info.replace('nan','NaN')
問題行:
media_info['info'] = json.loads(json_info, strict=False)

其他測試


HLS_KEY=5a867de28e7a029c2e995687b8992693
HLS_IV=c35263c8381d0b6b80f93360a5ca2ee6

mp4hls -f -o bento4_hls_aes128 \
  --master-playlist-name=encrypted.m3u8 \
  --media-playlist-name=media.m3u8 \
  --iframe-playlist-name=ifr.m3u8 \
  --encryption-key=${HLS_KEY}${HLS_IV} \
  --encryption-iv-mode=fps \
  --encryption-mode=AES-128 \
  --output-encryption-key --encryption-key-format=identity \
  fragmented.mp4

mp4hls -f -o bento4_hls_sampleaes \
  --master-playlist-name=encrypted.m3u8 \
  --media-playlist-name=media.m3u8 \
  --iframe-playlist-name=ifr.m3u8 \
  --encryption-key=${HLS_KEY}${HLS_IV} \
  --encryption-iv-mode=fps \
  --encryption-mode=SAMPLE-AES \
  --output-encryption-key --encryption-key-format=identity \
  fragmented.mp4


留言