harmonyos-best-practices-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/README.md +121 -0
  2. package/data/docs/bpta-2in1-window-shape.md +296 -0
  3. package/data/docs/bpta-abckitts-implements-instrumentation.md +1279 -0
  4. package/data/docs/bpta-add-watermark.md +379 -0
  5. package/data/docs/bpta-ads-jump.md +67 -0
  6. package/data/docs/bpta-agent.md +472 -0
  7. package/data/docs/bpta-always-on-market-watch.md +703 -0
  8. package/data/docs/bpta-analysis-of-image-blurring.md +231 -0
  9. package/data/docs/bpta-analyze-memory-problem.md +17 -0
  10. package/data/docs/bpta-animation-frame.md +28 -0
  11. package/data/docs/bpta-antipeep-protection.md +291 -0
  12. package/data/docs/bpta-app-architecture-overview.md +25 -0
  13. package/data/docs/bpta-app-asset-protection-design.md +277 -0
  14. package/data/docs/bpta-app-code-ob.md +180 -0
  15. package/data/docs/bpta-app-concurrency-design.md +1189 -0
  16. package/data/docs/bpta-app-data-security.md +397 -0
  17. package/data/docs/bpta-app-icon-configuration.md +226 -0
  18. package/data/docs/bpta-app-privacy-protection.md +295 -0
  19. package/data/docs/bpta-application-aspect-programming-design.md +675 -0
  20. package/data/docs/bpta-application-cold-start-optimization.md +1397 -0
  21. package/data/docs/bpta-application-continue-progess.md +285 -0
  22. package/data/docs/bpta-application-gesture-share.md +468 -0
  23. package/data/docs/bpta-application-knock-file-share.md +263 -0
  24. package/data/docs/bpta-application-knock-video-share.md +552 -0
  25. package/data/docs/bpta-application-latency-optimization-cases.md +615 -0
  26. package/data/docs/bpta-application-power-analysis.md +15 -0
  27. package/data/docs/bpta-application-power-optimization.md +12 -0
  28. package/data/docs/bpta-application-power-test.md +52 -0
  29. package/data/docs/bpta-application-track-practice.md +595 -0
  30. package/data/docs/bpta-arkts-high-performance.md +464 -0
  31. package/data/docs/bpta-arkts-js-memory-analysis.md +111 -0
  32. package/data/docs/bpta-arkts-language.md +18 -0
  33. package/data/docs/bpta-arkweb-component-security.md +1134 -0
  34. package/data/docs/bpta-arkweb_rendering_framework.md +412 -0
  35. package/data/docs/bpta-aspect-implements-aop.md +505 -0
  36. package/data/docs/bpta-audio-and-video.md +30 -0
  37. package/data/docs/bpta-audio-cast.md +460 -0
  38. package/data/docs/bpta-audio-focus-management.md +862 -0
  39. package/data/docs/bpta-audio-in-ear-monitor.md +803 -0
  40. package/data/docs/bpta-audio-playback-series.md +16 -0
  41. package/data/docs/bpta-audio-record-base-on-audiocapturer.md +188 -0
  42. package/data/docs/bpta-audio-record-base-on-avrecorder-arkts.md +179 -0
  43. package/data/docs/bpta-audio-record-base-on-avrecorder.md +207 -0
  44. package/data/docs/bpta-audio-record-base-on-avscreencapture.md +165 -0
  45. package/data/docs/bpta-audio-record-base-on-ohaudio.md +162 -0
  46. package/data/docs/bpta-audio-record-overview.md +34 -0
  47. package/data/docs/bpta-audio-record.md +16 -0
  48. package/data/docs/bpta-audio-ripple-animation.md +198 -0
  49. package/data/docs/bpta-audio-video-synchronization.md +508 -0
  50. package/data/docs/bpta-audio-video.md +15 -0
  51. package/data/docs/bpta-automated-testing-frameworks.md +481 -0
  52. package/data/docs/bpta-avplayer-basic-control.md +533 -0
  53. package/data/docs/bpta-avplayer-embeded-network-video.md +486 -0
  54. package/data/docs/bpta-avplayer-embeded-short-video.md +512 -0
  55. package/data/docs/bpta-avplayer-long-video.md +907 -0
  56. package/data/docs/bpta-avplayer-short-video.md +158 -0
  57. package/data/docs/bpta-avplayer-video-practices.md +15 -0
  58. package/data/docs/bpta-avscreencapture-for-screen-recording.md +1121 -0
  59. package/data/docs/bpta-back-task-implement.md +317 -0
  60. package/data/docs/bpta-background-blur.md +316 -0
  61. package/data/docs/bpta-background-sensors-baned-analysis.md +93 -0
  62. package/data/docs/bpta-best-practices-long-list.md +891 -0
  63. package/data/docs/bpta-best-practices-overview.md +48 -0
  64. package/data/docs/bpta-bluetooth-low-energy.md +905 -0
  65. package/data/docs/bpta-buffer-mode-transcoding.md +728 -0
  66. package/data/docs/bpta-buffer-power-optimization.md +224 -0
  67. package/data/docs/bpta-camera-shot2see.md +368 -0
  68. package/data/docs/bpta-card-update-and-data-interaction.md +670 -0
  69. package/data/docs/bpta-carousel-graphic-works.md +379 -0
  70. package/data/docs/bpta-cell-phone.md +13 -0
  71. package/data/docs/bpta-click-to-click-response-optimization.md +264 -0
  72. package/data/docs/bpta-click-to-complete-delay-analysis.md +637 -0
  73. package/data/docs/bpta-collaboration-office.md +1178 -0
  74. package/data/docs/bpta-comment-reply-pop-up-window.md +523 -0
  75. package/data/docs/bpta-common-list-flows.md +688 -0
  76. package/data/docs/bpta-common-list-operations.md +828 -0
  77. package/data/docs/bpta-common-network-query.md +784 -0
  78. package/data/docs/bpta-comparative_practice_of_taskpool_and_worker.md +381 -0
  79. package/data/docs/bpta-compatible-scheme.md +11 -0
  80. package/data/docs/bpta-complex-type-pass.md +868 -0
  81. package/data/docs/bpta-component-nesting-optimization.md +421 -0
  82. package/data/docs/bpta-component-reuse-issue-diagnosis-and-analysis.md +637 -0
  83. package/data/docs/bpta-component-reuse.md +1258 -0
  84. package/data/docs/bpta-concurrency-capability.md +23 -0
  85. package/data/docs/bpta-concurrent-optimization.md +369 -0
  86. package/data/docs/bpta-content-creation.md +646 -0
  87. package/data/docs/bpta-continue-cast.md +702 -0
  88. package/data/docs/bpta-continue-data.md +335 -0
  89. package/data/docs/bpta-continue.md +1323 -0
  90. package/data/docs/bpta-control-rendering-range.md +29 -0
  91. package/data/docs/bpta-controlling-background-process-cpu.md +31 -0
  92. package/data/docs/bpta-crash-monitor-practice.md +116 -0
  93. package/data/docs/bpta-cross-domain-solutions-for-web-pages.md +308 -0
  94. package/data/docs/bpta-cross-end-migration.md +13 -0
  95. package/data/docs/bpta-cross-module-reference.md +406 -0
  96. package/data/docs/bpta-cross-platform-compatibility.md +321 -0
  97. package/data/docs/bpta-custom-camera-photo.md +454 -0
  98. package/data/docs/bpta-custom-camera-preview.md +1170 -0
  99. package/data/docs/bpta-custom-camera-video.md +322 -0
  100. package/data/docs/bpta-custom-font-settings.md +354 -0
  101. package/data/docs/bpta-custom-hvigor-plugin.md +159 -0
  102. package/data/docs/bpta-custom-keyboard.md +519 -0
  103. package/data/docs/bpta-customdialog-selection-and-development.md +406 -0
  104. package/data/docs/bpta-dark-mode-adaptation.md +321 -0
  105. package/data/docs/bpta-deal-stride-solution.md +261 -0
  106. package/data/docs/bpta-decrease_pakage_size.md +126 -0
  107. package/data/docs/bpta-delayed-trigger-operation.md +215 -0
  108. package/data/docs/bpta-desktop-shortcuts.md +180 -0
  109. package/data/docs/bpta-detection.md +12 -0
  110. package/data/docs/bpta-developing-high-performance-ui.md +19 -0
  111. package/data/docs/bpta-development-scenarios-for-tabs.md +934 -0
  112. package/data/docs/bpta-dialog-encapsulation.md +201 -0
  113. package/data/docs/bpta-dispose-highly-loaded-component-render.md +352 -0
  114. package/data/docs/bpta-distribute-drag-cast.md +60 -0
  115. package/data/docs/bpta-distributed-pasteboard-cast.md +88 -0
  116. package/data/docs/bpta-distributed-pasteboard.md +314 -0
  117. package/data/docs/bpta-drawing-capability-improve-performance.md +436 -0
  118. package/data/docs/bpta-dynamic-link-library.md +272 -0
  119. package/data/docs/bpta-easygo-parallel.md +402 -0
  120. package/data/docs/bpta-fair-use-animation.md +1693 -0
  121. package/data/docs/bpta-file-transmission-based-on-sfft.md +265 -0
  122. package/data/docs/bpta-file-upload-and-download-performance.md +484 -0
  123. package/data/docs/bpta-foldable-guide.md +205 -0
  124. package/data/docs/bpta-folded-hover.md +202 -0
  125. package/data/docs/bpta-form-kit.md +12 -0
  126. package/data/docs/bpta-frontend-invisible-animation-analysis.md +187 -0
  127. package/data/docs/bpta-full-scenario-collaborative-development.md +13 -0
  128. package/data/docs/bpta-fuzzy-scene-performance-optimization.md +256 -0
  129. package/data/docs/bpta-game-prelaunch-practice.md +175 -0
  130. package/data/docs/bpta-general-comments.md +17 -0
  131. package/data/docs/bpta-gestures-practice.md +619 -0
  132. package/data/docs/bpta-global-state-management-state-store.md +472 -0
  133. package/data/docs/bpta-gpu-acceleration-practices.md +11 -0
  134. package/data/docs/bpta-graphic-drawing-practices.md +13 -0
  135. package/data/docs/bpta-grid-based-on-scrollcomponents.md +1112 -0
  136. package/data/docs/bpta-grid-drag-swap.md +725 -0
  137. package/data/docs/bpta-hadss_dialoghub.md +786 -0
  138. package/data/docs/bpta-harmony-application-security.md +1253 -0
  139. package/data/docs/bpta-hdrtosdr.md +439 -0
  140. package/data/docs/bpta-hdrvivid.md +700 -0
  141. package/data/docs/bpta-high-cpu-load-analysis.md +113 -0
  142. package/data/docs/bpta-high-performance-json-parsing.md +263 -0
  143. package/data/docs/bpta-high-performance-protobuf-parsing.md +259 -0
  144. package/data/docs/bpta-hmos-live-stream-audio-call.md +140 -0
  145. package/data/docs/bpta-hmos-live-stream-solution.md +495 -0
  146. package/data/docs/bpta-hmrouter.md +659 -0
  147. package/data/docs/bpta-hopping.md +60 -0
  148. package/data/docs/bpta-hwc-self-rendering-layer-analysis.md +77 -0
  149. package/data/docs/bpta-image-processing-practices.md +13 -0
  150. package/data/docs/bpta-image-to-video-synthesis.md +459 -0
  151. package/data/docs/bpta-image-white-lump-solution.md +282 -0
  152. package/data/docs/bpta-image_get_and_save.md +120 -0
  153. package/data/docs/bpta-implement-timeline-based-on-canvas.md +493 -0
  154. package/data/docs/bpta-implementing-image-filters.md +406 -0
  155. package/data/docs/bpta-implementing-image-resizable.md +270 -0
  156. package/data/docs/bpta-improve-layout-performance.md +547 -0
  157. package/data/docs/bpta-improve-running-efficiency.md +187 -0
  158. package/data/docs/bpta-improve_grid_performance.md +268 -0
  159. package/data/docs/bpta-input-method-framework.md +12 -0
  160. package/data/docs/bpta-intent-recommend-practice.md +313 -0
  161. package/data/docs/bpta-js-leak-watcher.md +153 -0
  162. package/data/docs/bpta-kernel-memory-analysis.md +38 -0
  163. package/data/docs/bpta-keyboard-layout-adapt.md +725 -0
  164. package/data/docs/bpta-landscape-and-portrait-development.md +947 -0
  165. package/data/docs/bpta-layered-architecture-design.md +82 -0
  166. package/data/docs/bpta-lazyforeach-optimization.md +217 -0
  167. package/data/docs/bpta-link-between-apps-overview.md +99 -0
  168. package/data/docs/bpta-list-based-on-scrollcomponents.md +1643 -0
  169. package/data/docs/bpta-lite-wearable-guide.md +1899 -0
  170. package/data/docs/bpta-live-form-development-practice.md +544 -0
  171. package/data/docs/bpta-live-streaming-optimization.md +397 -0
  172. package/data/docs/bpta-local-file-and-data-multithreaded-io.md +367 -0
  173. package/data/docs/bpta-local-file.md +11 -0
  174. package/data/docs/bpta-lock-screen-immersive-live-window.md +473 -0
  175. package/data/docs/bpta-long-snapshot-practice.md +1046 -0
  176. package/data/docs/bpta-low-power-consumption-of-background-tasks.md +14 -0
  177. package/data/docs/bpta-low-power-consumption-of-foreground-tasks.md +14 -0
  178. package/data/docs/bpta-low-power-design-in-dark-mode.md +418 -0
  179. package/data/docs/bpta-ltpo-description.md +323 -0
  180. package/data/docs/bpta-maleoon-gpu-best-practices.md +1297 -0
  181. package/data/docs/bpta-malloc-dispatch-table.md +144 -0
  182. package/data/docs/bpta-managing-audio-input-devices.md +350 -0
  183. package/data/docs/bpta-managing-audio-output-devices.md +399 -0
  184. package/data/docs/bpta-mate-book-fold.md +229 -0
  185. package/data/docs/bpta-matetv-guide.md +223 -0
  186. package/data/docs/bpta-matext-guide.md +269 -0
  187. package/data/docs/bpta-memory-basic-knowledge.md +71 -0
  188. package/data/docs/bpta-memory-optimization.md +545 -0
  189. package/data/docs/bpta-modular-design.md +282 -0
  190. package/data/docs/bpta-multi-device-adaptive-layout.md +775 -0
  191. package/data/docs/bpta-multi-device-adaptive.md +11 -0
  192. package/data/docs/bpta-multi-device-camera.md +584 -0
  193. package/data/docs/bpta-multi-device-collaboration.md +19 -0
  194. package/data/docs/bpta-multi-device-component-layout.md +190 -0
  195. package/data/docs/bpta-multi-device-design-principles.md +26 -0
  196. package/data/docs/bpta-multi-device-function.md +99 -0
  197. package/data/docs/bpta-multi-device-hardware.md +12 -0
  198. package/data/docs/bpta-multi-device-ide.md +124 -0
  199. package/data/docs/bpta-multi-device-interaction.md +11 -0
  200. package/data/docs/bpta-multi-device-layout-overview.md +47 -0
  201. package/data/docs/bpta-multi-device-overview.md +340 -0
  202. package/data/docs/bpta-multi-device-page-layout.md +699 -0
  203. package/data/docs/bpta-multi-device-page.md +19 -0
  204. package/data/docs/bpta-multi-device-resource.md +122 -0
  205. package/data/docs/bpta-multi-device-responsive-layout.md +1274 -0
  206. package/data/docs/bpta-multi-device-responsive.md +14 -0
  207. package/data/docs/bpta-multi-device-screen-diff.md +197 -0
  208. package/data/docs/bpta-multi-device-screen-layout.md +834 -0
  209. package/data/docs/bpta-multi-device-start.md +376 -0
  210. package/data/docs/bpta-multi-device-ui-development.md +27 -0
  211. package/data/docs/bpta-multi-device-window-direction.md +1322 -0
  212. package/data/docs/bpta-multi-device-window-immersive.md +364 -0
  213. package/data/docs/bpta-multi-device-window-mode.md +1293 -0
  214. package/data/docs/bpta-multi-device-window.md +13 -0
  215. package/data/docs/bpta-multi-device.md +13 -0
  216. package/data/docs/bpta-multi-interaction.md +368 -0
  217. package/data/docs/bpta-multi-mobile-payment.md +282 -0
  218. package/data/docs/bpta-multi-music-app-overview.md +365 -0
  219. package/data/docs/bpta-multi-settings-application-page.md +163 -0
  220. package/data/docs/bpta-multi-tab-practice.md +750 -0
  221. package/data/docs/bpta-multi-target.md +490 -0
  222. package/data/docs/bpta-multi-window-practice.md +795 -0
  223. package/data/docs/bpta-multi_game.md +472 -0
  224. package/data/docs/bpta-music-card.md +1916 -0
  225. package/data/docs/bpta-music-playback-scenarios.md +120 -0
  226. package/data/docs/bpta-native-memory-analysis.md +101 -0
  227. package/data/docs/bpta-native-sub-main-comm.md +323 -0
  228. package/data/docs/bpta-navigation-scenarios.md +69 -0
  229. package/data/docs/bpta-network-ca-security.md +241 -0
  230. package/data/docs/bpta-network-reconnection.md +327 -0
  231. package/data/docs/bpta-network-resources.md +24 -0
  232. package/data/docs/bpta-news-reading.md +12 -0
  233. package/data/docs/bpta-news_homepage.md +449 -0
  234. package/data/docs/bpta-object-serialization-performance.md +12 -0
  235. package/data/docs/bpta-one-shot-to-the-end.md +932 -0
  236. package/data/docs/bpta-online-video-playback-lags-practice.md +298 -0
  237. package/data/docs/bpta-optimization-overview.md +227 -0
  238. package/data/docs/bpta-optimization-tool-practice.md +20 -0
  239. package/data/docs/bpta-package-structure.md +13 -0
  240. package/data/docs/bpta-pad-guide.md +268 -0
  241. package/data/docs/bpta-page-brightness-settings.md +256 -0
  242. package/data/docs/bpta-page-transition.md +583 -0
  243. package/data/docs/bpta-pc-guide.md +438 -0
  244. package/data/docs/bpta-pc.md +12 -0
  245. package/data/docs/bpta-perceived-smoothness.md +49 -0
  246. package/data/docs/bpta-performance-detection.md +160 -0
  247. package/data/docs/bpta-performance-guide-reading.md +50 -0
  248. package/data/docs/bpta-performance-mainthread-consumption-detection.md +11 -0
  249. package/data/docs/bpta-performance-optimization.md +23 -0
  250. package/data/docs/bpta-performance-runtime-detection.md +13 -0
  251. package/data/docs/bpta-performance-sliding-frame-drop-detection.md +19 -0
  252. package/data/docs/bpta-performance-startup-time-detection.md +13 -0
  253. package/data/docs/bpta-permission-application.md +318 -0
  254. package/data/docs/bpta-permission-timeout-analysis.md +51 -0
  255. package/data/docs/bpta-photo.md +15 -0
  256. package/data/docs/bpta-picture-preview.md +464 -0
  257. package/data/docs/bpta-picture.md +12 -0
  258. package/data/docs/bpta-playing-formatted-audio-based-avplayer-arkts.md +481 -0
  259. package/data/docs/bpta-playing-formatted-audio-based-avplayer-cpp.md +593 -0
  260. package/data/docs/bpta-playing-pcm-audio-based-audiorenderer.md +959 -0
  261. package/data/docs/bpta-playing-pcm-audio-based-ohaudio.md +599 -0
  262. package/data/docs/bpta-playing-short-audio-based-soundpool.md +182 -0
  263. package/data/docs/bpta-positioning.md +364 -0
  264. package/data/docs/bpta-power-basic-quality-test.md +35 -0
  265. package/data/docs/bpta-power-consumption-analysis.md +12 -0
  266. package/data/docs/bpta-power-consumption-develop-analysis.md +12 -0
  267. package/data/docs/bpta-power-consumption-experience.md +119 -0
  268. package/data/docs/bpta-power-consumption-runtime-analysis.md +15 -0
  269. package/data/docs/bpta-power_overview.md +26 -0
  270. package/data/docs/bpta-pptimized-component-drawing.md +27 -0
  271. package/data/docs/bpta-pre-connect.md +133 -0
  272. package/data/docs/bpta-preloading-resources.md +21 -0
  273. package/data/docs/bpta-program-framework.md +15 -0
  274. package/data/docs/bpta-properly-use-foreground-resources.md +22 -0
  275. package/data/docs/bpta-purax-guide.md +215 -0
  276. package/data/docs/bpta-quality-overview.md +79 -0
  277. package/data/docs/bpta-reader-page-flip.md +890 -0
  278. package/data/docs/bpta-reasonable-audio-playback-use.md +42 -0
  279. package/data/docs/bpta-reasonable-audio-use.md +163 -0
  280. package/data/docs/bpta-reasonable-bluetooth-use.md +52 -0
  281. package/data/docs/bpta-reasonable-gps-use.md +59 -0
  282. package/data/docs/bpta-reasonable-network-use.md +105 -0
  283. package/data/docs/bpta-reasonable-position-navigation-use.md +47 -0
  284. package/data/docs/bpta-reasonable-request-use.md +77 -0
  285. package/data/docs/bpta-reasonable-sensor-use.md +53 -0
  286. package/data/docs/bpta-reasonable-system-use.md +67 -0
  287. package/data/docs/bpta-recommended-use-of-device-id.md +79 -0
  288. package/data/docs/bpta-reduce-layout-nodes.md +30 -0
  289. package/data/docs/bpta-reduce-time-consuming.md +36 -0
  290. package/data/docs/bpta-redundancy-refresh-guide.md +409 -0
  291. package/data/docs/bpta-render-web-using-same-layer-render.md +601 -0
  292. package/data/docs/bpta-resource-and-storage-optimization.md +14 -0
  293. package/data/docs/bpta-retrieve-process-memory-info.md +49 -0
  294. package/data/docs/bpta-rich-text-display.md +475 -0
  295. package/data/docs/bpta-rich-text-editor.md +426 -0
  296. package/data/docs/bpta-risk-control-engine.md +146 -0
  297. package/data/docs/bpta-scenario-performance-optimization.md +17 -0
  298. package/data/docs/bpta-scenario-power-optimization.md +12 -0
  299. package/data/docs/bpta-scenario-stability-address-sanitizer.md +210 -0
  300. package/data/docs/bpta-scenario-stability-app-freeze.md +615 -0
  301. package/data/docs/bpta-scenario-stability-cppcrash.md +516 -0
  302. package/data/docs/bpta-scenario-stability-exception-exit.md +12 -0
  303. package/data/docs/bpta-scenario-stability-jscrash.md +922 -0
  304. package/data/docs/bpta-scenario-stability-leak.md +276 -0
  305. package/data/docs/bpta-scenario-stability.md +14 -0
  306. package/data/docs/bpta-screen-flicker-solution.md +480 -0
  307. package/data/docs/bpta-shared-bicycle.md +509 -0
  308. package/data/docs/bpta-short-video-base-adaptivevideo.md +403 -0
  309. package/data/docs/bpta-smart-reach.md +306 -0
  310. package/data/docs/bpta-smartwatch.md +755 -0
  311. package/data/docs/bpta-smartwatchnavigation.md +384 -0
  312. package/data/docs/bpta-smooth-application-design.md +225 -0
  313. package/data/docs/bpta-smooth-switching.md +294 -0
  314. package/data/docs/bpta-social-communications.md +11 -0
  315. package/data/docs/bpta-social-share.md +637 -0
  316. package/data/docs/bpta-solutions-to-special-issues.md +12 -0
  317. package/data/docs/bpta-sound-quality-switching.md +422 -0
  318. package/data/docs/bpta-spatiality-immersive.md +531 -0
  319. package/data/docs/bpta-special-text-recognition.md +137 -0
  320. package/data/docs/bpta-stability-address-illegal-way.md +190 -0
  321. package/data/docs/bpta-stability-address-sanitizer-catagory.md +212 -0
  322. package/data/docs/bpta-stability-address-sanitizer-faq.md +32 -0
  323. package/data/docs/bpta-stability-address-sanitizer-opt.md +170 -0
  324. package/data/docs/bpta-stability-address-sanitizer-overview.md +23 -0
  325. package/data/docs/bpta-stability-address-sanitizer-principle.md +179 -0
  326. package/data/docs/bpta-stability-analysis.md +17 -0
  327. package/data/docs/bpta-stability-app-analyzer.md +11 -0
  328. package/data/docs/bpta-stability-app-crash-cpp-way.md +200 -0
  329. package/data/docs/bpta-stability-app-crash-js-way.md +148 -0
  330. package/data/docs/bpta-stability-app-crash.md +13 -0
  331. package/data/docs/bpta-stability-app-freeze-ark-runtime.md +339 -0
  332. package/data/docs/bpta-stability-app-freeze-opt.md +80 -0
  333. package/data/docs/bpta-stability-app-freeze-way.md +410 -0
  334. package/data/docs/bpta-stability-app-freeze.md +12 -0
  335. package/data/docs/bpta-stability-app-killed-way.md +49 -0
  336. package/data/docs/bpta-stability-ark-detection.md +12 -0
  337. package/data/docs/bpta-stability-ark-exception-detection.md +38 -0
  338. package/data/docs/bpta-stability-ark-runtime-detection.md +134 -0
  339. package/data/docs/bpta-stability-asan-detection.md +450 -0
  340. package/data/docs/bpta-stability-coding-standard-api.md +2054 -0
  341. package/data/docs/bpta-stability-coding-standard-cpp.md +91 -0
  342. package/data/docs/bpta-stability-coding-standard-libuv.md +772 -0
  343. package/data/docs/bpta-stability-coding-standard-ndk-arkts.md +189 -0
  344. package/data/docs/bpta-stability-coding-standard-node.md +478 -0
  345. package/data/docs/bpta-stability-coding-standard.md +16 -0
  346. package/data/docs/bpta-stability-cpp-crash-opt.md +346 -0
  347. package/data/docs/bpta-stability-detection.md +14 -0
  348. package/data/docs/bpta-stability-deveco-testing.md +73 -0
  349. package/data/docs/bpta-stability-develop-detection.md +17 -0
  350. package/data/docs/bpta-stability-exception-exit-opt.md +12 -0
  351. package/data/docs/bpta-stability-fault-log.md +14 -0
  352. package/data/docs/bpta-stability-fault-type.md +31 -0
  353. package/data/docs/bpta-stability-file-handle-detection.md +96 -0
  354. package/data/docs/bpta-stability-gwpasan-detection.md +588 -0
  355. package/data/docs/bpta-stability-hwasan-detection.md +360 -0
  356. package/data/docs/bpta-stability-ide-static-detection.md +343 -0
  357. package/data/docs/bpta-stability-js-crash-opt.md +21 -0
  358. package/data/docs/bpta-stability-js-memleak-detection.md +214 -0
  359. package/data/docs/bpta-stability-leak-detection.md +15 -0
  360. package/data/docs/bpta-stability-leak-opt.md +251 -0
  361. package/data/docs/bpta-stability-leak-way.md +459 -0
  362. package/data/docs/bpta-stability-log-specs.md +31 -0
  363. package/data/docs/bpta-stability-log-standard-hilog.md +191 -0
  364. package/data/docs/bpta-stability-log-standard.md +11 -0
  365. package/data/docs/bpta-stability-memleak-detection-overview.md +109 -0
  366. package/data/docs/bpta-stability-native-memleak-detection.md +204 -0
  367. package/data/docs/bpta-stability-operate-apm.md +113 -0
  368. package/data/docs/bpta-stability-operate-app-event.md +320 -0
  369. package/data/docs/bpta-stability-operate-event.md +11 -0
  370. package/data/docs/bpta-stability-operate.md +15 -0
  371. package/data/docs/bpta-stability-opt.md +18 -0
  372. package/data/docs/bpta-stability-overview.md +17 -0
  373. package/data/docs/bpta-stability-ram-detection.md +17 -0
  374. package/data/docs/bpta-stability-runtime-address-sanitizer-detection.md +21 -0
  375. package/data/docs/bpta-stability-runtime-appkilled-detection.md +44 -0
  376. package/data/docs/bpta-stability-runtime-crash-detection.md +14 -0
  377. package/data/docs/bpta-stability-runtime-detection.md +14 -0
  378. package/data/docs/bpta-stability-runtime-exception-exit-detection.md +12 -0
  379. package/data/docs/bpta-stability-runtime-freeze-detection.md +21 -0
  380. package/data/docs/bpta-stability-runtime-leak-detection.md +31 -0
  381. package/data/docs/bpta-stability-testing.md +11 -0
  382. package/data/docs/bpta-stability-thread-detection.md +11 -0
  383. package/data/docs/bpta-stability-thread-leak-detection.md +35 -0
  384. package/data/docs/bpta-stability-tsan-detection.md +477 -0
  385. package/data/docs/bpta-stability-ubsan-detection.md +350 -0
  386. package/data/docs/bpta-startup-response-optimization.md +12 -0
  387. package/data/docs/bpta-state-refresh.md +48 -0
  388. package/data/docs/bpta-static-scenarios.md +63 -0
  389. package/data/docs/bpta-status-management.md +872 -0
  390. package/data/docs/bpta-surface-encoder.md +427 -0
  391. package/data/docs/bpta-swiper_high_performance_development_guide.md +357 -0
  392. package/data/docs/bpta-tablet-pc.md +11 -0
  393. package/data/docs/bpta-taskpool_usage_specifications_and_faqs.md +625 -0
  394. package/data/docs/bpta-text-expand-collapse.md +274 -0
  395. package/data/docs/bpta-texture-compression-improve-performance.md +336 -0
  396. package/data/docs/bpta-thread-priority-setting.md +233 -0
  397. package/data/docs/bpta-threads-serialization-timeout-analysis.md +169 -0
  398. package/data/docs/bpta-time-optimization-of-the-main-thread.md +1239 -0
  399. package/data/docs/bpta-travel-navigation.md +11 -0
  400. package/data/docs/bpta-tv.md +11 -0
  401. package/data/docs/bpta-ui-component-encapsulation.md +585 -0
  402. package/data/docs/bpta-ui-component-performance-optimization.md +597 -0
  403. package/data/docs/bpta-ui-dynamic-operations.md +618 -0
  404. package/data/docs/bpta-ui-skip-analysis.md +191 -0
  405. package/data/docs/bpta-unified-drag-and-drop.md +1189 -0
  406. package/data/docs/bpta-use-of-background-hardware-resources.md +16 -0
  407. package/data/docs/bpta-use-of-background-software-resources.md +14 -0
  408. package/data/docs/bpta-use-of-background-tasks.md +23 -0
  409. package/data/docs/bpta-utilize-hwc-efficiently.md +461 -0
  410. package/data/docs/bpta-vdeocast.md +558 -0
  411. package/data/docs/bpta-video-adaptation-based-web.md +462 -0
  412. package/data/docs/bpta-video-barrage.md +68 -0
  413. package/data/docs/bpta-video-codec.md +42 -0
  414. package/data/docs/bpta-video-component-long-video.md +659 -0
  415. package/data/docs/bpta-video-component-short-video.md +337 -0
  416. package/data/docs/bpta-video-layer.md +32 -0
  417. package/data/docs/bpta-video-practices.md +12 -0
  418. package/data/docs/bpta-video-render.md +1225 -0
  419. package/data/docs/bpta-video-rom.md +37 -0
  420. package/data/docs/bpta-video-thumbnail.md +179 -0
  421. package/data/docs/bpta-video-wifi.md +40 -0
  422. package/data/docs/bpta-vsync-power-optimization.md +116 -0
  423. package/data/docs/bpta-waterflow-based-on-scrollcomponents.md +989 -0
  424. package/data/docs/bpta-waterflow-operations.md +991 -0
  425. package/data/docs/bpta-waterflow-performance-optimization.md +191 -0
  426. package/data/docs/bpta-wavewheel-for-image-editor.md +421 -0
  427. package/data/docs/bpta-wear.md +12 -0
  428. package/data/docs/bpta-web-adaptation.md +451 -0
  429. package/data/docs/bpta-web-app-jump-and-pull-up.md +310 -0
  430. package/data/docs/bpta-web-click-response-delay-analysis.md +164 -0
  431. package/data/docs/bpta-web-completion-delay-analysis.md +209 -0
  432. package/data/docs/bpta-web-develop-optimization.md +2596 -0
  433. package/data/docs/bpta-web-development.md +15 -0
  434. package/data/docs/bpta-web-frame-rate-performance-analysis.md +252 -0
  435. package/data/docs/bpta-web-interceptor.md +724 -0
  436. package/data/docs/bpta-web-performance-optimization.md +11 -0
  437. package/data/docs/bpta-window-and-screen-management.md +12 -0
  438. package/data/docs/bpta-zhenlv.md +559 -0
  439. package/data/docs/changelog.md +1410 -0
  440. package/data/docs/low-power-consumption-suggestions.md +246 -0
  441. package/data/docs/multi-business-office.md +275 -0
  442. package/data/docs/multi-communication-app.md +240 -0
  443. package/data/docs/multi-community-app.md +257 -0
  444. package/data/docs/multi-convenient-life.md +501 -0
  445. package/data/docs/multi-financial-app.md +288 -0
  446. package/data/docs/multi-news-read.md +286 -0
  447. package/data/docs/multi-picture-app.md +219 -0
  448. package/data/docs/multi-shopping-price-comparison.md +254 -0
  449. package/data/docs/multi-short-video-app.md +315 -0
  450. package/data/docs/multi-ticket-class.md +458 -0
  451. package/data/docs/multi-travel-accommodation.md +361 -0
  452. package/data/docs/multi-travel-navigation.md +449 -0
  453. package/data/docs/multi-video-app.md +492 -0
  454. package/data/index.md +2886 -0
  455. package/dist/data.js +180 -0
  456. package/dist/index.js +203 -0
  457. package/dist/search.js +102 -0
  458. package/package.json +57 -0
  459. package/scripts/trim-code-extra.mjs +78 -0
  460. package/scripts/trim-code.mjs +106 -0
@@ -0,0 +1,512 @@
1
+ # 基于AVPlayer播放嵌入式短视频实践
2
+
3
+ > 来源: https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-avplayer-embeded-short-video
4
+ > 文档标识(fileName): bpta-avplayer-embeded-short-video
5
+ > 目录(catalogName): best-practices
6
+ > 语言: cn
7
+ > 更新时间: 2026-06-23 03:35:58
8
+ > 导航地址: /hmos/hmos-dp1
9
+
10
+ ---
11
+ #### 概述
12
+
13
+ 本文适用于视频播放类应用开发,针对市场上主流视频播放应用常见场景,介绍如何基于[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)系统播放器实现嵌入式短视频播放。本文指导开发者实现以下几种场景:
14
+
15
+ - [基础播控能力](#section19871518619)
16
+ - [焦点管理](#section9451174918313)
17
+ - [前后台感知](#section1560144415411)
18
+ - [横竖屏切换和旋转感知](#section92411245940)
19
+ - [画中画播放](#section17471045441)
20
+ - [视频首帧显示](#section11121172718716)
21
+ - [嵌入式视频列表自动播放](#section1243616221447)
22
+ - [视频无缝转场播放](#section129361938786)
23
+
24
+ #### 基础播控能力
25
+
26
+ 通过[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)实现视频资源加载、播放、暂停、停止、退出操作,包含了静音播放、倍数设置和字幕挂载等功能,实现原理详情可参考[《基于AVPlayer基础播控实践》](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-avplayer-basic-control)。
27
+
28
+ #### 焦点管理
29
+
30
+ ## 场景描述
31
+
32
+ 前台视频播放过程中,音频被后台闹钟、电话等中断事件打断,完成播放过程音视频焦点管理。
33
+
34
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/7f/v3/IRErzpPRRDmMfOyZYVPvoA/zh-cn_image_0000002485843225.gif?HW-CC-KV=V1&HW-CC-Date=20260623T075548Z&HW-CC-Expire=86400&HW-CC-Sign=121530C69813C7C13EB35E7F12755891AB66DED7D8556853A67B180CE0A5ECC2 "点击放大")
35
+
36
+ ## 开发步骤
37
+
38
+ 具体开发步骤可参考基于AVPlayer播放长视频实践的[焦点管理开发步骤](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-avplayer-long-video#section1716082163419)。
39
+
40
+ #### 前后台感知
41
+
42
+ ## 场景描述
43
+
44
+ 应用从后台切回到前台时,保持原视频播放且会从之前的位置继续播放。
45
+
46
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/91/v3/gpVnqdrjT9aAXvAj9rCIgA/zh-cn_image_0000002485723289.gif?HW-CC-KV=V1&HW-CC-Date=20260623T075548Z&HW-CC-Expire=86400&HW-CC-Sign=F43922FD5B7ABFEF237ED63BA1D7F51323940CAD49FD487B6FF4123E08F2E8E2 "点击放大")
47
+
48
+ ## 开发步骤
49
+
50
+ 具体开发步骤可参考基于AVPlayer播放长视频实践的[前后台感知开发步骤](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-avplayer-long-video#section1448773335411)。
51
+
52
+ #### 横竖屏切换和旋转感知
53
+
54
+ ## 场景描述
55
+
56
+ 播放视频时可以手动进行横竖屏切换,也支持根据设备旋转方向自动切换横竖屏模式,以适应不同屏幕方向下的视频播放需求。
57
+
58
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/c0/v3/did7A3CnTVCwZOyOdVuKuw/zh-cn_image_0000002452803500.gif?HW-CC-KV=V1&HW-CC-Date=20260623T075548Z&HW-CC-Expire=86400&HW-CC-Sign=D798863D6716A5860348140D56F690F9DBA6752F7A065F025B9E8A6C8411282B "点击放大")
59
+
60
+ ## 开发步骤
61
+
62
+ 具体开发步骤可参考基于AVPlayer播放长视频实践的[横竖屏切换和旋转感知开发步骤](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-avplayer-long-video#section1257185216407)。
63
+
64
+ #### 画中画播放
65
+
66
+ ## 场景描述
67
+
68
+ 画中画模式用户可进行其他界面操作,提升使用体验。应用场景包括视频播放、直播、视频通话和视频会议等。
69
+
70
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/5d/v3/y7JjdLphRJ6UxEyv5P592Q/zh-cn_image_0000002452643884.gif?HW-CC-KV=V1&HW-CC-Date=20260623T075548Z&HW-CC-Expire=86400&HW-CC-Sign=6769C0D32D71C474DDA17B696C631B82302F1F29E5E9C30334F2E9DF0339ECD0 "点击放大")
71
+
72
+ ## 开发步骤
73
+
74
+ 具体开发步骤可参考基于AVPlayer播放长视频实践的[画中画播放开发步骤](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-avplayer-long-video#section4691194231313)。
75
+
76
+ #### 视频首帧显示
77
+
78
+ ## 场景描述
79
+
80
+ 视频播放列表或播放窗口中显示视频首帧作为视频描述信息。
81
+
82
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/c9/v3/WVBslCwbSD-iirbHuaP_qQ/zh-cn_image_0000002485843233.gif?HW-CC-KV=V1&HW-CC-Date=20260623T075548Z&HW-CC-Expire=86400&HW-CC-Sign=579683329D952A1DEB7F8C1572939F7A38B851CB6CDECA102FE906B257781F80 "点击放大")
83
+
84
+ ## 开发步骤
85
+
86
+ 具体开发步骤可参考基于AVPlayer播放长视频实践的[视频首帧显示开发步骤](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-avplayer-long-video#section27212108403)。
87
+
88
+ #### 嵌入式视频列表自动播放
89
+
90
+ ## 场景描述
91
+
92
+ 用户浏览视频列表时自动播放视频,在用户滑动视频列表时自动切换至首个完全可见的视频播放。
93
+
94
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ef/v3/Vls9Op_JTQOqCJrf2vbR8Q/zh-cn_image_0000002485723317.gif?HW-CC-KV=V1&HW-CC-Date=20260623T075548Z&HW-CC-Expire=86400&HW-CC-Sign=D39ADB6716A27CE09283DE6832643BC59F902DD327954F798419B249D9FC3472 "点击放大")
95
+
96
+ ## 实现原理
97
+
98
+ 使用[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)组件实现视频播放列表页面。通过监听列表滑动[onScrollStop()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-list#onscrollstop)事件,在滑动停止时获取滑动偏移量offset,计算首个可完全展示的视频的索引,切换至该视频播放,实现视频列表中首个可见视频自动播放效果。
99
+
100
+ 逻辑如下:
101
+
102
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/16/v3/ITgR7c4gT-25APNv0v-bnA/zh-cn_image_0000002455462614.png?HW-CC-KV=V1&HW-CC-Date=20260623T075548Z&HW-CC-Expire=86400&HW-CC-Sign=17B638B04FF65AFBDEE89618CE820E8F45711D7003DCFCE13902F7EB4809C79C "点击放大")
103
+
104
+ ## 开发步骤
105
+
106
+ 1. 创建视频列表的模拟数据。
107
+
108
+ ```
109
+ export const VIDEO_DATA: VideoItemData[] =
110
+ [
111
+ new VideoItemData($r('app.string.info_detail'), 0, '1.mp4', $r(`app.media.preview1`)),
112
+ new VideoItemData($r('app.string.info_detail'), 0, '2.mp4', $r(`app.media.preview2`)),
113
+ new VideoItemData($r('app.string.info_detail'), 0, '3.mp4', $r(`app.media.preview3`)),
114
+ // ...
115
+ ];
116
+ ```
117
+
118
+ 2. 声明initAVPlayer()方法初始化[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)实例。
119
+
120
+ ```
121
+ // Create an AVPlayer instance
122
+ public async initAVPlayer(source: VideoData, surfaceId: string) {
123
+ // ...
124
+ // Creates the avPlayer instance object.
125
+ this.avPlayer = await media.createAVPlayer();
126
+ // Creates a callback function for state machine changes.
127
+ this.setAVPlayerCallback();
128
+ // ...
129
+ }
130
+ ```
131
+ 3. 创建setStateChangeCallback()状态回调函数,[AVPlayerState](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-t#avplayerstate9)状态为prepared时,使用[emitter.emit()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-emitter#emitteremit)传递当前[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)实例的高度和宽度。
132
+
133
+ ```
134
+ private setStateChangeCallback() {
135
+ // ...
136
+ // Callback function for state machine changes
137
+ this.avPlayer.on('stateChange', async (state) => {
138
+ // ...
139
+ switch (state) {
140
+ // ...
141
+ case 'prepared': // This state machine is reported after the prepare interface is successfully invoked.
142
+ // ...
143
+ let eventData: emitter.EventData = {
144
+ data: {
145
+ 'percent': this.avPlayer.width / this.avPlayer.height
146
+ }
147
+ };
148
+ emitter.emit(CommonConstants.AVPLAYER_PREPARED, eventData);
149
+ // ...
150
+ break;
151
+ // ...
152
+ }
153
+ });
154
+ }
155
+ ```
156
+ 4. 使用[getDefaultDisplaySync()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-display#displaygetdefaultdisplaysync9)方法获取当前屏幕宽度,以默认16:9的屏幕比例,通过屏幕宽度计算[RelativeContainer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-relativecontainer)组件的高度和宽度,计算[ListItem](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-listitem)所需高度;订阅[AVPlayerState](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-t#avplayerstate9)状态为prepared的事件,获取[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)实例的高度和宽度。
157
+
158
+ ```
159
+ aboutToAppear() {
160
+ try {
161
+ this.windowClass.setWindowSystemBarProperties({
162
+ // Status bar color
163
+ statusBarColor: '#1A1A1A'
164
+ }).catch((error: BusinessError) => {
165
+ hilog.error(Constants.DOMAIN, TAG,
166
+ `setWindowSystemBarProperties failed, Code:${error.code}, message:${error.message}`);
167
+ });
168
+
169
+ // Calculated based on screen width RelativeContainer width
170
+ let winWidth = this.getUIContext().px2vp(display.getDefaultDisplaySync().width);
171
+ this.frameWidth = winWidth - Constants.LIST_ITEM_LEFT_PADDING - Constants.LIST_ITEM_RIGHT_PADDING;
172
+ this.frameHeight = Math.floor(this.frameWidth / Constants.WH_RADIO);
173
+ this.listItemHeight =
174
+ this.frameHeight + Constants.TITLE_HEIGHT + Constants.LIST_ITEM_TOP_PADDING + Constants.INFO_AREA_HEIGHT;
175
+ emitter.on('prepared', (eventData: emitter.EventData) => {
176
+ let vWidth: number = eventData.data!.width;
177
+ let vHeight: number = eventData.data!.height;
178
+ let surfaceID: string = eventData.data!.surfaceID;
179
+ if (this.playIdx < this.dataSource.totalCount()) {
180
+ let playSurfaceID = this.dataSource.getData(this.playIdx).surfaceID;
181
+ if (playSurfaceID === surfaceID) {
182
+ this.setXComponentWH(vWidth, vHeight);
183
+ }
184
+ }
185
+ });
186
+ } catch (error) {
187
+ if (error.code !== null && error.message !== null) {
188
+ hilog.error(Constants.DOMAIN, TAG, `aboutToAppear failed, code is ${error.code}, message is ${error.message}`);
189
+ }
190
+ }
191
+ }
192
+ ```
193
+ 5. 根据[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)实例的高度、宽度计算设置[XComponent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-xcomponent)的高度、宽度。
194
+
195
+ ```
196
+ /*
197
+ * Calculate XComponent Width&Height
198
+ */
199
+ setXComponentWH(vWidth: number, vHeight: number) {
200
+ let radio = vWidth / vHeight;
201
+ if (radio > 1) {
202
+ // Horizontal video
203
+ this.xWidth = this.frameWidth;
204
+ this.xHeight = Math.floor(this.xWidth / radio);
205
+ if (this.xHeight > this.frameHeight) {
206
+ this.xHeight = this.frameHeight;
207
+ this.xWidth = Math.floor(this.xHeight * radio);
208
+ }
209
+ } else {
210
+ // Vertical video
211
+ this.xHeight = this.frameHeight;
212
+ this.xWidth = Math.floor(this.xHeight * radio);
213
+ if (this.xWidth > this.frameWidth) {
214
+ this.xWidth = this.frameWidth;
215
+ this.xHeight = Math.floor(this.xWidth / radio);
216
+ }
217
+ }
218
+ }
219
+ ```
220
+ 6. 声明avPlayerController的实例。
221
+
222
+ ```
223
+ private avPlayerController: AvPlayerController = new AvPlayerController();
224
+ ```
225
+ 7. 在页面的[onDidBuild()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-custom-component-lifecycle#ondidbuild12)函数中加载模拟视频数据,初始化加载首个视频数据。
226
+
227
+ ```
228
+ onDidBuild(): void {
229
+ this.dataSource.loadData();
230
+ this.play(this.playIdx);
231
+ }
232
+ ```
233
+ 8. 根据所需播放视频的索引,获取视频相关信息,使用videoReset()方法重置[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)实例,随后利用获取的视频信息调用[initAVPlayer()](#li71231589325)方法重新初始化,设置该实例的surfaceId,确保其在指定surfaceId的组件上播放。
234
+
235
+ ```
236
+ play(index: number) {
237
+ this.startRender = false;
238
+ // Reset AVPlayer
239
+ this.avPlayerController.videoReset().then(() => {
240
+ // ...
241
+ this.isMuted = true;
242
+ // Init AVPlayer
243
+ this.avPlayerController.initAVPlayer({
244
+ type: VideoDataType.RAW_FILE,
245
+ videoSrc: this.dataSource.getData(index).src!,
246
+ name: $r("app.string.app_name"),
247
+ description: '',
248
+ caption: '',
249
+ index: 0,
250
+ seekTime: stopTime,
251
+ isMuted: true,
252
+ head: $r("app.media.preview1")
253
+ }, surfaceID);
254
+ // ...
255
+ });
256
+ }
257
+ ```
258
+ 9. 用[List](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-list)显示视频列表,使用[LazyForEach](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-rendering-control-lazyforeach)对列表数据进行懒加载。
259
+
260
+ ```
261
+ List({ scroller: this.listScroller }) {
262
+ LazyForEach(this.dataSource, (info: VideoInfo, index: number) => {
263
+ ListItem() {
264
+ this.videoItemBuilder(info, index)
265
+ }
266
+ // ...
267
+ }, (info: VideoInfo) => info.id)
268
+ }
269
+ ```
270
+ 10. 创建[XComponent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-xcomponent)组件,其提供用于图形绘制和媒体数据写入的Surface,负责将其嵌入视图中,用于视频播放。
271
+
272
+ ```
273
+ XComponent({
274
+ type: XComponentType.SURFACE,
275
+ controller: info.xController
276
+ })
277
+ ```
278
+ 11. 在[XComponent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-xcomponent)组件的[onLoad()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-xcomponent#onload)加载事件中,使用[getXComponentSurfaceId()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-xcomponent#getxcomponentsurfaceid9)获取该播放组件的Id,将其Id设置到[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)的surfaceId上,即可实现在该组件上播放视频。
279
+
280
+ ```
281
+ .onLoad(() => {
282
+ let surfaceID = info.xController!.getXComponentSurfaceId();
283
+ info.surfaceID = surfaceID;
284
+ if (info.id === this.unloadID) {
285
+ this.play(index);
286
+ }
287
+ })
288
+ ```
289
+ 12. 设置[List](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-list)的[onScrollStop()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-list#onscrollstop)事件,在列表滑动停止时触发,根据滑动偏移量及单个[ListItem](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-container-listitem)的高度计算当前屏幕内首个可完整显示的视频索引。若计算得出的视频索引与当前播放视频索引不符,则使用play()方法重新初始化[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer),切换至计算得出的视频进行播放。
290
+
291
+ ```
292
+ .onScrollStop(() => {
293
+ let yOffset = this.listScroller.currentOffset().yOffset;
294
+ let curIndex = Math.floor(yOffset / (this.listItemHeight + Constants.LIST_DIVIDER_WIDTH));
295
+ let offsetInItem = yOffset - curIndex * (this.listItemHeight + Constants.LIST_DIVIDER_WIDTH);
296
+ if (offsetInItem > Constants.LIST_ITEM_TOP_PADDING + 34) {
297
+ curIndex += 1;
298
+ }
299
+ this.curIndex = curIndex;
300
+ if (curIndex !== this.playIdx && curIndex < this.dataSource.totalCount()) {
301
+ setTimeout(() => {
302
+ if (this.curIndex === curIndex && this.curIndex !== this.playIdx) {
303
+ this.play(curIndex);
304
+ }
305
+ }, Constants.DELAY_MS);
306
+ }
307
+ })
308
+ ```
309
+
310
+ #### 视频无缝转场播放
311
+
312
+ ## 场景描述
313
+
314
+ 视频播放无缝转场是影音娱乐类应用中的典型场景之一,如视频列表中自动播放的热门视频,点击当前播放视频跳转至视频详情页后继续播放。
315
+
316
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/b2/v3/mNIJXSIjSJK_DGrGw2REnQ/zh-cn_image_0000002452643900.gif?HW-CC-KV=V1&HW-CC-Date=20260623T075548Z&HW-CC-Expire=86400&HW-CC-Sign=8C11358B2F1727461AE85E8C511D926CE51AB3D372574D706F703928F8F791E5 "点击放大")
317
+
318
+ ## 实现原理
319
+
320
+ 基于[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)与[XComponent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-xcomponent)实现视频播放,通过切换AVPlayer的surfaceId控制不同XComponent播放视频,实现转场效果,使用[seek()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#seek9)方法跳转至指定位置播放,主要分为两部分:
321
+
322
+ **列表页面跳转到详情页面**:当点击正在播放的视频时,记录当前播放视频的索引、播放进度、总时长、surfaceId信息,并在页面跳转[pushPathByName()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-navigation#pushpathbyname10)方法中传入此视频信息。在视频播放详情页面使用[getParamByIndex()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-navigation#getparambyindex10)接收传入信息,根据接收的视频信息使用initAVPlayer()初始化AVPlayer实例,初始化新的XComponent组件和surfaceID,将其绑定到AVPlayer上,使用seek()方法从记录的播放进度开始播放;
323
+
324
+ **详情页面返回到列表页面**:在详情页面点击返回时,记录当前播放视频的索引、播放进度、总时长、原surfaceId信息,并在页面回调[onBackPressed()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-app-ability-uiability#onbackpressed10)函数中,使用[pop()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ohos-arkui-advanced-multinavigation#pop)方法传入此视频信息,根据接收的视频信息,使用play(index)初始化AVPlayer,将其surfaceId设置为原surfaceId,使用seek()方法从记录的播放进度开始播放。
325
+
326
+ 逻辑如下:
327
+
328
+ ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/25/v3/aZybaAT6Q3qzvmLSGaaSkw/zh-cn_image_0000002485843257.png?HW-CC-KV=V1&HW-CC-Date=20260623T075548Z&HW-CC-Expire=86400&HW-CC-Sign=683370324EAB7819061A613BAA912E48488008F132EC3AB863F68EC4AD10EA5C "点击放大")
329
+
330
+ ## 开发步骤
331
+
332
+ 1. 创建route_map.json路由配置文件,配置视频跳转播放页面参数信息。
333
+
334
+ ```
335
+ {
336
+ "routerMap": [
337
+ {
338
+ "name": "DetailPage",
339
+ "pageSourceFile": "src/main/ets/pages/DetailPage.ets",
340
+ "buildFunction": "detailPageBuilder"
341
+ }
342
+ ]
343
+ }
344
+ ```
345
+ 2. 创建AppRouter.ets文件,声明页面路由相关操作方法。
346
+
347
+ ```
348
+ public getPathStack(): NavPathStack {
349
+ return this.pathStack;
350
+ }
351
+ ```
352
+ 3. 在首页的[Navigation](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-navigation)组件中使用[getPathStack()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-navigation#getpathstack19)获取页面路由信息。
353
+
354
+ ```
355
+ build() {
356
+ Navigation(AppRouter.getInstance().getPathStack()) {
357
+ // ...
358
+ }
359
+ .hideTitleBar(true)
360
+ .width('100%')
361
+ .height('100%')
362
+ .mode(NavigationMode.Stack)
363
+ }
364
+ ```
365
+ 4. 在[pushPathByName()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-navigation#pushpathbyname10)基础上封装pushByName()方法,用于页面跳转时的参数传递。
366
+
367
+ ```
368
+ public static pushByName(name: string, param: Object, onPop: Callback<PopInfo>): void {
369
+ AppRouter.instance.pushPathByName(name, param, onPop);
370
+ }
371
+ ```
372
+ 5. 设置[XComponent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-xcomponent)的点击事件,当用户点击当前播放的视频时,保存当前播放进度,然后使用[pushByName()](#li1647811562593)方法,在页面跳转的同时将当前播放视频相关信息传递到视频详情页面。
373
+
374
+ ```
375
+ .onClick(() => {
376
+ // Save video data
377
+ AppStorage.setOrCreate(Constants.SURFACE_ID_KEY, info.surfaceID);
378
+ this.avPlayerController.videoPause();
379
+
380
+ info.stopTime = this.avPlayerController.currentTime;
381
+ info.duration = this.avPlayerController.duration;
382
+ // Jump video play detail
383
+ AppRouter.pushByName(Constants.DETAIL_PAGE_NAME,
384
+ new VideoParams(info, this.playIdx, index), () => {
385
+ let param: VideoParams = AppStorage.get("BackParam") as VideoParams;
386
+ let _index = param.index;
387
+ this.dataSource.getData(_index).stopTime = param.videoInfo.stopTime;
388
+ this.play(param.playIdx);
389
+ })
390
+ })
391
+ ```
392
+ 6. 基于[getParamByIndex()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-navigation#getparambyindex10)封装getLastParams()方法,用于页面跳转后获取传递的参数。
393
+
394
+ ```
395
+ public static getLastParams(): Object {
396
+ return AppRouter.instance.pathStack.getParamByIndex(AppRouter.instance.pathStack.size() - 1) as Object;
397
+ }
398
+ ```
399
+ 7. 在视频详情页面的[aboutToAppear()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-custom-component-lifecycle#abouttoappear)事件中,使用[getLastParams()](#li1482553124015)方法获取传递的参数信息,取消[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)实例的静音设置。
400
+
401
+ ```
402
+ aboutToAppear(): void {
403
+ try {
404
+ this.mainWin = this.windowStage.getMainWindowSync();
405
+ this.windowClass = this.context.windowStage.getMainWindowSync();
406
+ } catch (error) {
407
+ let err = error as BusinessError;
408
+ hilog.error(Constants.DOMAIN, TAG, `getMainWindowSync error, code: ${err.code};message: ${err.message};`);
409
+ }
410
+
411
+ this.setOrientation();
412
+ // ...
413
+
414
+ // Get params
415
+ let params = AppRouter.getLastParams() as VideoParams;
416
+ this.info = params.videoInfo;
417
+ this.playIdx = params.playIdx;
418
+ this.index = params.index;
419
+ this.src = params.videoInfo.src as string;
420
+ this.currentTime = this.info.stopTime as number;
421
+ this.duration = this.info.duration;
422
+ this.avPlayerController.videoMuted(false);
423
+ // ...
424
+ }
425
+ ```
426
+ 8. 在视频详情页面创建[XComponent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-xcomponent#xcomponent19)组件。
427
+
428
+ ```
429
+ XComponent({
430
+ type: XComponentType.SURFACE,
431
+ controller: this.xComponentController
432
+ })
433
+ .id(`videoXComponent_${this.info?.id}`)
434
+ ```
435
+ 9. [XComponent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-xcomponent#xcomponent19)的[onLoad()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-xcomponent#onload)事件中重新初始化[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer)实例,将跳转时的播放时间进度currentTime传递给[AVPlayer](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer),然后使用[seek()](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#seek9)跳转到currentTime时间帧继续播放。
436
+
437
+ ```
438
+ .onLoad(() => {
439
+ // Init AVPlayer
440
+ this.surfaceId = this.xComponentController.getXComponentSurfaceId();
441
+ if (this.avPlayerController !== undefined) {
442
+ this.avPlayerController.initAVPlayer({
443
+ type: VideoDataType.RAW_FILE,
444
+ videoSrc: this.src,
445
+ name: $r("app.string.app_name"),
446
+ description: '',
447
+ caption: 'captions.srt',
448
+ index: 0,
449
+ seekTime: this.currentTime,
450
+ head: $r("app.media.preview1")
451
+ }, this.surfaceId);
452
+ }
453
+ })
454
+ ```
455
+ 10. 声明handleBackAction()方法,当在详情页面点击返回按钮时,记录当前播放视频的信息,包括视频当前进度、总时长、索引等。
456
+
457
+ ```
458
+ handleBackAction() {
459
+ if (this.isLayoutFullScreen) {
460
+ // Cancel full screen
461
+ this.isLayoutFullScreen = false;
462
+ this.setWindowDirection(window.Orientation.PORTRAIT);
463
+ }
464
+
465
+ this.isPIPShow = false;
466
+ this.windowClass?.setWindowSystemBarProperties({
467
+ // Status bar color
468
+ statusBarColor: '#1A1A1A'
469
+ }).catch((error: BusinessError) => {
470
+ hilog.error(Constants.DOMAIN, TAG,
471
+ `setWindowSystemBarProperties: Failed. code: ${error.code} ;message: ${error.message}`);
472
+ });
473
+
474
+ this.avPlayerController.videoPause();
475
+ this.isPlaying = false;
476
+ // Save params
477
+ if (this.info !== undefined) {
478
+ this.info.stopTime = this.avPlayerController.currentTime;
479
+ }
480
+ let param: VideoParams = new VideoParams(
481
+ this.info as VideoInfo,
482
+ this.playIdx,
483
+ this.index
484
+ )
485
+ AppStorage.setOrCreate("BackParam", param);
486
+ AppRouter.popWithParam(Object({ result: true }));
487
+ }
488
+ ```
489
+ 11. 在视频列表页面的点击跳转事件[pushByName()](#li1647811562593)方法中,使用回调函数接收详情页面返回参数信息,随后调用[play()](#li37514173917)方法,设置[seekTime](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-media-avplayer#seek9)为currentTime以继续播放。
490
+
491
+ ```
492
+ .onClick(() => {
493
+ // Save video data
494
+ AppStorage.setOrCreate(Constants.SURFACE_ID_KEY, info.surfaceID);
495
+ this.avPlayerController.videoPause();
496
+
497
+ info.stopTime = this.avPlayerController.currentTime;
498
+ info.duration = this.avPlayerController.duration;
499
+ // Jump video play detail
500
+ AppRouter.pushByName(Constants.DETAIL_PAGE_NAME,
501
+ new VideoParams(info, this.playIdx, index), () => {
502
+ let param: VideoParams = AppStorage.get("BackParam") as VideoParams;
503
+ let _index = param.index;
504
+ this.dataSource.getData(_index).stopTime = param.videoInfo.stopTime;
505
+ this.play(param.playIdx);
506
+ })
507
+ })
508
+ ```
509
+
510
+ #### 示例代码
511
+
512
+ - [基于AVPlayer实现嵌入式短视频播放](https://gitcode.com/harmonyos_samples/avplayer-embeded-short-video/tree/master/)