解決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參數, 在某些影片中無法得到正常數值所造成的。
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行:
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
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
留言