Advertisement
Guest User

Untitled

a guest
Sep 27th, 2022
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.58 KB | None | 0 0
  1. hls.def
  2. エンコーダオプションを3か所変更して副音声と5.1ch音声に対応・字幕を配信
  3. --avhw //VCEEncCはavswがいいらしい
  4. --audio-codec aac:aac_coder=twoloop --audio-stream 1?:stereo --audio-stream 2?:stereo
  5. --data-copy timed_id3 --avsync //なんとなくこの位置に
  6.  
  7. デフォルトのhls.def
  8. 公式のストリーミング設定からビットレートと解像度を変更
  9. Wifiで8Mpbs、高速モバイルで1Mpbs、低速モバイルで200kbps程度を意識
  10. NVEncC・VCEEncCも同じオプションでいけるはず
  11. encoder=相対パス\QSVEncC.exe
  12. window=hide
  13.  
  14. high=-f hls -m hls_time:2 -m hls_list_size:1 -m hls_segment_filename:{segment-id}-%d.ts --output-thread 0 --avqsv --audio-codec aac --audio-ignore-notrack-error --audio-samplerate 48000 --audio-bitrate 192 --avsync forcecfr -c h264 --vbr 8192 --gop-len 60 --tff --vpp-deinterlace normal --output-res 1920x1080 -i - -o -
  15. middle=-f hls -m hls_time:2 -m hls_list_size:1 -m hls_segment_filename:{segment-id}-%d.ts --output-thread 0 --avqsv --audio-codec aac --audio-ignore-notrack-error --audio-samplerate 48000 --audio-bitrate 192 --avsync forcecfr -c h264 --vbr 1024 --gop-len 60 --tff --vpp-deinterlace normal --output-res 1280x720 -i - -o -
  16. low=-f hls -m hls_time:2 -m hls_list_size:1 -m hls_segment_filename:{segment-id}-%d.ts --output-thread 0 --avqsv --audio-codec aac --audio-ignore-notrack-error --audio-samplerate 48000 --audio-bitrate 64 --avsync forcecfr -c h264 --vbr 128 --gop-len 60 --tff --vpp-deinterlace normal --output-res 320x180 -i - -o -
  17.  
  18. デフォルトのmain.def
  19. 終了マージンをマイナスにする場合はソースの変更が必要
  20. うちの環境では終了マージンが0秒だと2秒程度早く終わるので-2、CSが3秒遅いので-3
  21. 録画ファイル名はTVTestと同じにした
  22. EPG更新が6時だとほぼ電波あり
  23. tvtest=フルパス\TvmaidMAYA\tvtest\TVTest.exe
  24. record.folder=フルパス\録画フォルダ
  25. record.margin.start=3
  26. record.margin.end=-8
  27. record.file={start-yyyy}{start-MM}{start-dd}{start-hh}{start-mm}_{title}.ts
  28. epg.hour=6
  29. url=http://+:20001/
  30. autosleep=off
  31. postprocess=
  32. epgurl=http://localhost:20001/maya/index.html
  33. epg.basic=4,6,7
  34. chat.niconico.mail=
  35. chat.niconico.password=
  36.  
  37. デフォルトのtuner.def
  38. BonDriverProxyExを利用
  39. defaultフォルダに入れておけばチューナ更新だけで設定完了
  40. 地上1=フルパス\TvmaidMAYA\tvtest\BonDriver_T.dll
  41. 地上2=フルパス\TvmaidMAYA\tvtest\BonDriver_T.dll
  42. 地上3=フルパス\TvmaidMAYA\tvtest\BonDriver_T.dll
  43. 地上4=フルパス\TvmaidMAYA\tvtest\BonDriver_T.dll
  44. BS・CS1=フルパス\TvmaidMAYA\tvtest\BonDriver_S.dll
  45. BS・CS2=フルパス\TvmaidMAYA\tvtest\BonDriver_S.dll
  46. BS・CS3=フルパス\TvmaidMAYA\tvtest\BonDriver_S.dll
  47. BS・CS4=フルパス\TvmaidMAYA\tvtest\BonDriver_S.dll
  48.  
  49. 副音声と5.1ch音声に対応・ARIB字幕をid3 timed-metadataに変換できるようにする
  50. tsreadex.exeをルート(Tvmaid.exeのあるフォルダ)に設置
  51. ソースの変更も必要
  52.  
  53. 字幕を表示するためaribb24.jsをビルドして設置
  54. 1.node.jsのzipをダウンロードして解凍したフォルダにaribb24.js-mainフォルダを入れる
  55. 2.コマンドプロンプトでnode.exeのあるフォルダに移動して「npm i aribb24.js」を実行
  56. 3.node_modules\aribb24.js\distにaribb24.jsがあるのでTvmaidMAYA\wwwroot\libに設置
  57.  
  58. 字幕オフアイコンのsubtitles_off EF72が入っているmaterial-iconsに更新
  59. https://github.com/jossef/material-design-icons-iconfont/tree/master/dist/fonts
  60. から
  61. MaterialIcons-Regular.ttf
  62. MaterialIcons-Regular.woff
  63. MaterialIcons-Regular.woff2
  64. をダウンロードしてTvmaidMAYA\wwwroot\material-iconsフォルダの中身を上書き
  65.  
  66. epg.tag.html
  67. ユーザ番組表を削除 //使わない場合
  68. { text: "ユーザ1" },
  69. { text: "ユーザ2" },
  70. { text: "ユーザ3" },
  71.  
  72. 番組表変更時に左端に移動 //真ん中の1行
  73. self.epgName = item.text
  74. content.scrollLeft = 0
  75. load()
  76.  
  77. now-barの横幅を修正して番組表変更時に横幅がリセットされるようにする //下の1行
  78. var nowbar = self.refs["now-bar"]
  79. var width = self.refs["service-bar"].scrollWidth - 30
  80.  
  81. index.html
  82. 字幕を表示するためaribb24.jsを追加 //真ん中の1行
  83. <script src="/lib/hls.min.js"></script>
  84. <script src="/lib/aribb24.js"></script>
  85. <script src="jslib.js"></script>
  86.  
  87. デフォルト設定をhls emu,high,削除済み録画は表示しないに変更 //hlsはApple端末のみ
  88. if (localStorage.getItem("epg-hour-hight") == null)
  89. localStorage.setItem("epg-hour-hight", 200)
  90.  
  91. if (localStorage.getItem("stream-type") == null)
  92. localStorage.setItem("stream-type", "hls emu")
  93.  
  94. if (localStorage.getItem("video-mode") == null)
  95. localStorage.setItem("video-mode", "high")
  96.  
  97. if (localStorage.getItem("hls-ready") == null)
  98. localStorage.setItem("hls-ready", "1")
  99.  
  100. if (localStorage.getItem("record/view") == null)
  101. localStorage.setItem("record/view", "1")
  102. })
  103.  
  104. live.tag.html
  105. ニコニコ実況ボタンを削除 //使わない場合
  106. <button class="btn pull-right" onclick="{ changeChatMode }"><i class="material-icons">{ chatMode ? "&#xE0B7;" : "&#xE0CA;" }</i></button>
  107.  
  108. ミュートボタンと音量バーと字幕ボタンを設置 //置く場所で順番を変えられる
  109. <button class="btn pull-left" onclick="{ selectService }">{ service }</button>
  110. <button class="btn pull-right" onclick="{ changeCaption }"><i class="material-icons">{ captionStatus ? "&#xE048;" : "&#xEF72;" }</i></button>
  111. <input type="range" class="btn pull-right" oninput="{ volume }" id="live/volume" min="0.0" max="1.0" step="0.1" value="1.0">
  112. <button class="btn pull-right" onclick="{ mute }" id="live/mute"><i class="material-icons">&#xE050;</i></button>
  113. <button class="btn pull-right" onclick="{ playToggle }"><i class="material-icons">{ playIcon ? "&#xE037;" : "&#xE047;" }</i></button>
  114.  
  115. 字幕用レンダラを定義 //hlsjsと一緒に使うのでここに置いた
  116. var hlsjs
  117. var renderer
  118.  
  119. デフォルトで字幕オン //ニコニコ実況ボタンと機能が近いのでここに置いた
  120. self.chatMode = localStorage.getItem("live/chat-mode") == 1
  121. self.captionStatus = localStorage.getItem("live/caption") ?? 1 == 1
  122.  
  123. ミュートと音量変更と字幕オンオフ機能を追加 //function playHlsEmu(url)の上に置いた
  124. mute()
  125. {
  126. if (video.muted)
  127. video.muted = false
  128. else
  129. video.muted = true
  130. volumeicon()
  131. }
  132.  
  133. volume()
  134. {
  135. video.volume = document.getElementById('live/volume').value
  136. video.muted = false
  137. volumeicon()
  138. }
  139.  
  140. function volumeicon()
  141. {
  142. if (video.muted)
  143. document.getElementById('live/mute').innerHTML = '<i class="material-icons">&#xE04F;</i>'
  144. else
  145. {
  146. if (video.volume > 0.5)
  147. document.getElementById('live/mute').innerHTML = '<i class="material-icons">&#xE050;</i>'
  148. else if (video.volume > 0.0)
  149. document.getElementById('live/mute').innerHTML = '<i class="material-icons">&#xE04D;</i>'
  150. else
  151. document.getElementById('live/mute').innerHTML = '<i class="material-icons">&#xE04E;</i>'
  152. }
  153. }
  154.  
  155. changeCaption()
  156. {
  157. self.captionStatus = !self.captionStatus
  158. localStorage.setItem("live/caption", self.captionStatus ? 1 : 0)
  159. if (renderer != null && self.captionStatus)
  160. renderer.show()
  161. else if (renderer != null)
  162. renderer.hide()
  163. }
  164.  
  165. function playHlsEmu(url)
  166.  
  167. HLS EMUで字幕を表示 //hlsjsの宣言の下
  168. hlsjs = new Hls({ manifestLoadingTimeOut: 20000, manifestLoadingMaxRetry: 3, maxMaxBufferLength: 10 })
  169. hlsjs.on(Hls.Events.FRAG_PARSING_METADATA, function (event, data)
  170. {
  171. for (var sample of data.samples)
  172. renderer.pushID3v2Data(sample.pts, sample.data)
  173. })
  174. hlsjs.on(Hls.Events.MEDIA_ATTACHED, function ()
  175.  
  176. 字幕をアタッチする //function play()でhlsかhls emuの場合
  177. self.videoState = "Starting..."
  178.  
  179. renderer = new aribb24js.CanvasRenderer(
  180. {
  181. enableAutoInBandMetadataTextTrackDetection: !Hls.isSupported(),
  182. })
  183. renderer.attachMedia(video)
  184.  
  185. if (self.captionStatus)
  186. renderer.show()
  187. else
  188. renderer.hide()
  189.  
  190. record-play.tag.html
  191. ニコニコ実況ボタンを削除 //使わない場合
  192. <button class="btn pull-right" onclick="{ changeChatMode }"><i class="material-icons">{ chatMode ? "&#xE0B7;" : "&#xE0CA;" }</i></button>
  193.  
  194. ミュートボタンと音量バーと字幕ボタンを設置 //置く場所で順番を変えられる
  195. <button class="btn" onclick="{ stop }"><i class="material-icons">&#xE047;</i></button>
  196. <button class="btn" onclick="{ mute }" id="record/mute"><i class="material-icons">&#xE050;</i></button>
  197. <input type="range" class="btn" oninput="{ volume }" id="record/volume" min="0.0" max="1.0" step="0.1" value="1.0">
  198. <button class="btn" onclick="{ changeCaption }"><i class="material-icons">{ captionStatus ? "&#xE048;" : "&#xEF72;" }</i></button>
  199. <button class="btn" onclick="{ longseek }" id="time-counter">{ timeCounter }</button>
  200.  
  201. 字幕用レンダラを定義 //hlsjsと一緒に使うのでここに置いた
  202. var hlsjs
  203. var renderer
  204.  
  205. デフォルトで字幕オン //ニコニコ実況ボタンと機能が近いのでここに置いた
  206. self.chatMode = localStorage.getItem("record/chat-mode") == 1
  207. self.captionStatus = localStorage.getItem("record/caption") ?? 1 == 1
  208.  
  209. ミュートと音量変更と字幕オンオフ機能を追加 //function playHlsEmu(url)の上に置いた
  210. mute()
  211. {
  212. if (video.muted)
  213. video.muted = false
  214. else
  215. video.muted = true
  216. volumeicon()
  217. }
  218.  
  219. volume()
  220. {
  221. video.volume = document.getElementById('record/volume').value
  222. video.muted = false
  223. volumeicon()
  224. }
  225.  
  226. function volumeicon()
  227. {
  228. if (video.muted)
  229. document.getElementById('record/mute').innerHTML = '<i class="material-icons">&#xE04F;</i>'
  230. else
  231. {
  232. if (video.volume > 0.5)
  233. document.getElementById('record/mute').innerHTML = '<i class="material-icons">&#xE050;</i>'
  234. else if (video.volume > 0.0)
  235. document.getElementById('record/mute').innerHTML = '<i class="material-icons">&#xE04D;</i>'
  236. else
  237. document.getElementById('record/mute').innerHTML = '<i class="material-icons">&#xE04E;</i>'
  238. }
  239. }
  240.  
  241. changeCaption()
  242. {
  243. self.captionStatus = !self.captionStatus
  244. localStorage.setItem("record/caption", self.captionStatus ? 1 : 0)
  245. if (renderer != null && self.captionStatus)
  246. renderer.show()
  247. else if (renderer != null)
  248. renderer.hide()
  249. }
  250.  
  251. function playHlsEmu(url)
  252.  
  253. HLS EMUで字幕を表示 //hlsjsの宣言の下
  254. hlsjs = new Hls({ manifestLoadingTimeOut: 20000, manifestLoadingMaxRetry: 3, maxMaxBufferLength: 10 })
  255. hlsjs.on(Hls.Events.FRAG_PARSING_METADATA, function (event, data)
  256. {
  257. for (var sample of data.samples)
  258. renderer.pushID3v2Data(sample.pts, sample.data)
  259. })
  260. hlsjs.on(Hls.Events.MEDIA_ATTACHED, function ()
  261.  
  262. 字幕をアタッチする //function play()でhlsかhls emuの場合
  263. var ready = localStorage.getItem("hls-ready")
  264. self.videoState = "Starting..."
  265.  
  266. renderer = new aribb24js.CanvasRenderer(
  267. {
  268. enableAutoInBandMetadataTextTrackDetection: !Hls.isSupported(),
  269. })
  270. renderer.attachMedia(video)
  271.  
  272. if (self.captionStatus)
  273. renderer.show()
  274. else
  275. renderer.hide()
  276.  
  277. setting.tag.html
  278. ユーザ番組表編集を削除 //使わない場合
  279. <div>ユーザ番組表編集</div>
  280. <div>
  281. <button class="btn" onclick="{ editUserEpg }" data-id="1">ユーザ1</button>
  282. </div>
  283. <div>
  284. <button class="btn" onclick="{ editUserEpg }" data-id="2">ユーザ2</button>
  285. </div>
  286. <div>
  287. <button class="btn" onclick="{ editUserEpg }" data-id="3">ユーザ3</button>
  288. </div>
  289.  
  290. ストリーミングのPD方式を削除してhls emuをデフォルトに設定 //使わない場合
  291. var list =
  292. [
  293. { text: "hls emu" },
  294. { text: "hls" }
  295. ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement