1PK4w2m*M%V3j-V~L^$i|&C@b?D?9tfwE{B^}Z$k8e5FmQ>v7Xz)sG32g9t}YBt
zyR$+*_00RmPx+0mW+vVG4mxd(n$(eQf3-w>JPl2UJpafrPaL5@2j}%{VE-)
zBI%6Qpj*dsdH<;g!S!avA~bv^0E+
zfyJbSjPb+j;J52U)<|cIcntQBI2T#>2;tOxu{%D?kML476AErF(qN9hPva5Nkc@BF
zC-tLF@3ZFb%Kpj)M<{)x*l|*Ia@ECeXo2E4h2f!aV=cHAhi_E_mfUth(sM4^hJq7B
zQsGWqdZUm9S%F`$nQ*_#NcuD`&)Ek%_s{&^78{9Hm
ztri&rYLOxgFdG>O@+XHy
z9#;|&vBCPXH5Mon^I`jSuR$&~ZWtyB67ujzFSj!51>#C}C17~TffQ{c-!QFQkTQ%!
zIR^b1`zHx|*1GU?tbBx23weFLz5H?y_Q%N&t$}k?w+``2A=aotj0;2v$~AL
z{scF-cL{wsdrmPvf#a9OHyYLcwQD4Kcm)`LLwMh4WT~p29f7M!iafJSU`IV}QY5Wa
z(n44-9oA}?J{a+ah*@31WTs#&J#o1`H98#6IQf;Wv0N_!);f&9g7o-k(lW5rWnDUR
zQBFIRG+X=6NnsI@mxnwm;tf5;_Uxg?jZ8m-m0}&6+DA!qam(p$mN5R})yA_7m$q@|
zFEd|dpS595rxQr-n#GjI5i-AhnUE>Cr;jpCqSrD~EwK_DqI^7%3#p5)%T_od!t3SOmH9MyXeeGO2(UQL;ax|x?Ncixmeo1=$
z{-);Au{*tfzOG?KQ~K|ak8-HQ?`Pekhe2WM(8s{xv-p>Zmu_6{G!-oE$7$mY`MOJorI=+mMx?H;`pr!;fVYz?5~yXBACruWB`Ph
zZM}90_<^OBxIhyZ9BW$`>6JvO;%VFpqVr8|7t3~AmxYak6?`Pp#c;**_SYmi`&z23
z`p6_~ePvH)C6x-G9$hgL=eVALq`-AiamN>!3~Lxw&{H(b{B(7xSRm6<3<{%{yXiH#
zos5Rv1L+8fUKJLo%P>4I&$}y
Date: Thu, 4 Sep 2025 20:00:05 +0800
Subject: [PATCH 07/25] =?UTF-8?q?=E5=AD=97=E5=B9=95=E8=AF=AD=E8=A8=80?=
=?UTF-8?q?=E5=88=87=E6=8D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
AppScope/resources/base/media/app_icon.png | Bin 0 -> 2777 bytes
.../ets/controller/AvPlayerController.ets | 64 +++--
entry/src/main/ets/views/LanguageDialog.ets | 125 +++++++++
entry/src/main/ets/views/VideoOperate.ets | 253 ++++++++++--------
.../main/resources/base/element/string.json | 13 +-
.../main/resources/en_US/element/string.json | 12 +
.../main/resources/rawfile/en_captions.srt | 47 ++++
.../main/resources/zh_CN/element/string.json | 12 +
8 files changed, 401 insertions(+), 125 deletions(-)
create mode 100644 AppScope/resources/base/media/app_icon.png
create mode 100644 entry/src/main/ets/views/LanguageDialog.ets
create mode 100644 entry/src/main/resources/rawfile/en_captions.srt
diff --git a/AppScope/resources/base/media/app_icon.png b/AppScope/resources/base/media/app_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..a39445dc87828b76fed6d2ec470dd455c45319e3
GIT binary patch
literal 2777
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
literal 0
HcmV?d00001
diff --git a/entry/src/main/ets/controller/AvPlayerController.ets b/entry/src/main/ets/controller/AvPlayerController.ets
index f244d33..e7ac073 100644
--- a/entry/src/main/ets/controller/AvPlayerController.ets
+++ b/entry/src/main/ets/controller/AvPlayerController.ets
@@ -166,21 +166,7 @@ export class AvPlayerController {
`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);
this.avPlayer.reset(); // resets the resources and triggers the idle state
})
- // [Start RegisterCaptionCallBack]
- this.avPlayer.on('subtitleUpdate', (info: media.SubtitleInfo) => {
- if (!!info) {
- let text = (!info.text) ? '' : info.text;
- let startTime = (!info.startTime) ? 0 : info.startTime;
- let duration = (!info.duration) ? 0 : info.duration;
- this.currentCaption = text; //update current caption content
- hilog.info(CommonConstants.LOG_DOMAIN, TAG,
- `subtitleUpdate info: text:${text}, startTime:${startTime}, duration:${duration}`);
- } else {
- this.currentCaption = '';
- hilog.error(CommonConstants.LOG_DOMAIN, TAG, 'subtitleUpdate info is null');
- }
- });
- // [End RegisterCaptionCallBack]
+ this.subtitleUpdateFunction()
this.setStateChangeCallback();
}
@@ -503,6 +489,52 @@ export class AvPlayerController {
}
}
}
-
// [End window_scale_fun]
+
+ subtitleUpdateFunction(): void {
+ try {
+ if (this.avPlayer) {
+ // [Start RegisterCaptionCallBack]
+ this.avPlayer.on('subtitleUpdate', (info: media.SubtitleInfo) => {
+ if (!!info) {
+ let text = (!info.text) ? '' : info.text;
+ let startTime = (!info.startTime) ? 0 : info.startTime;
+ let duration = (!info.duration) ? 0 : info.duration;
+ this.currentCaption = text; //update current caption content
+ hilog.info(CommonConstants.LOG_DOMAIN, TAG,
+ `subtitleUpdate info: text:${text}, startTime:${startTime}, duration:${duration}`);
+ } else {
+ this.currentCaption = '';
+ hilog.error(CommonConstants.LOG_DOMAIN, TAG, 'subtitleUpdate info is null');
+ }
+ });
+ // [End RegisterCaptionCallBack]
+ }
+ } catch (err) {
+ hilog.error(CommonConstants.LOG_DOMAIN, TAG,
+ `subtitleUpdateFunction failed, code is ${err.code}, message is ${err.message}`);
+ }
+ }
+
+ async languageChange(languageSelect: number = 0): Promise {
+ if (this.avPlayer) {
+ try {
+ if (this.curSource && this.curSource.caption) {
+ if (!this.context) {
+ hilog.info(CommonConstants.LOG_DOMAIN, TAG, `initPlayer failed context not set`);
+ return
+ }
+ this.curSource.caption = languageSelect === 0 ? 'captions.srt' : 'en_captions.srt'
+ let fileDescriptorSub = await this.context.resourceManager.getRawFd(this.curSource.caption);
+ this.avPlayer.addSubtitleFromFd(fileDescriptorSub.fd, fileDescriptorSub.offset, fileDescriptorSub.length);
+ this.currentCaption = ''
+ this.subtitleUpdateFunction()
+ hilog.info(CommonConstants.LOG_DOMAIN, TAG, 'language change');
+ }
+ } catch (err) {
+ hilog.error(CommonConstants.LOG_DOMAIN, TAG,
+ `languageChange failed, code is ${err.code}, message is ${err.message}`);
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/entry/src/main/ets/views/LanguageDialog.ets b/entry/src/main/ets/views/LanguageDialog.ets
new file mode 100644
index 0000000..fc1fd1e
--- /dev/null
+++ b/entry/src/main/ets/views/LanguageDialog.ets
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2025 Huawei Device Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { AvPlayerController } from '../controller/AvPlayerController';
+
+// Index of the playback rate list.
+const ZERO = 0;
+const ONE = 1;
+
+// [Start video_language_dialog]
+/**
+ * Set language dialog
+ */
+@CustomDialog
+export struct LanguageDialog {
+ @State languageList: Resource[] =
+ [$r('app.string.Chinese'), $r('app.string.English')];
+ @Link languageSelect: number; // Index of the current selection
+ @StorageLink('avPlayerController') avPlayerController: AvPlayerController = new AvPlayerController();
+ private controller: CustomDialogController;
+
+ build() {
+ Column() {
+ Text($r('app.string.language_switch'))// [StartExclude text_style1]
+ .fontSize($r('app.float.size_20'))
+ .fontWeight(FontWeight.Bold)
+ .width('90%')
+ .fontColor(Color.Black)
+ .textAlign(TextAlign.Center)
+ .margin({ top: $r('app.float.size_20'), bottom: $r('app.float.size_12') })
+ // [EndExclude text_style1]
+
+ List() {
+ ForEach(this.languageList, (item: Resource, index) => {
+ ListItem() {
+ Column() {
+ Row() {
+ Text(item)// [StartExclude text_style2]
+ .fontSize($r('app.float.size_16'))
+ .fontColor(Color.Black)
+ .fontWeight(FontWeight.Medium)
+ .textAlign(TextAlign.Center)
+ // [EndExclude text_style2]
+ Blank()
+ Image(this.languageSelect === index ? $r('app.media.ic_radio_selected') :
+ $r('app.media.ic_radio'))// [StartExclude text_style3]
+ .width($r('app.float.size_24'))
+ .height($r('app.float.size_24'))
+ .objectFit(ImageFit.Contain)
+ // [EndExclude text_style3]
+ }
+ // [StartExclude text_style4]
+ .width('100%')
+
+ if (index != this.languageList.length - ONE) {
+ Divider()
+ .vertical(false)
+ .strokeWidth(1)
+ .margin({ top: $r('app.float.size_10') })
+ .color($r('app.color.speed_dialog'))
+ .width('100%')
+ }
+ // [EndExclude text_style4]
+ }
+ .width('90%')
+ }
+ .width('100%')
+ .height($r('app.float.size_48'))
+ .onClick(() => {
+ this.languageSelect = index;
+ AppStorage.setOrCreate('currentLanguageType', this.languageSelect);
+ this.avPlayerController.languageChange(this.languageSelect);
+ this.controller.close();
+ })
+ }, (item: Resource, index) => index + '_' + JSON.stringify(item))
+ }
+ // [StartExclude cancel]
+ .width('100%')
+ .height('192vp')
+ .margin({
+ top: $r('app.float.size_12')
+ })
+
+ Row() {
+ Text($r('app.string.dialog_cancel'))
+ .fontSize($r('app.float.size_16'))
+ .fontColor('#0A59F7')
+ .fontWeight(FontWeight.Medium)
+ .layoutWeight(1)
+ .textAlign(TextAlign.Center)
+ .onClick(() => {
+ this.controller.close();
+ })
+ }
+ .alignItems(VerticalAlign.Center)
+ .height($r('app.float.size_50'))
+ .padding({ bottom: $r('app.float.size_5') })
+ .width('100%')
+
+ // [EndExclude cancel]
+ }
+ // [StartExclude box_style]
+ .alignItems(HorizontalAlign.Center)
+ .width('100%')
+ .margin({ left: $r('app.float.size_16'), right: $r('app.float.size_16') })
+ .borderRadius($r('app.float.size_24'))
+ .backgroundColor(Color.White)
+
+ // [EndExclude box_style]
+ }
+}
+
+// [End video_language_dialog]
\ No newline at end of file
diff --git a/entry/src/main/ets/views/VideoOperate.ets b/entry/src/main/ets/views/VideoOperate.ets
index 39b911b..715b821 100644
--- a/entry/src/main/ets/views/VideoOperate.ets
+++ b/entry/src/main/ets/views/VideoOperate.ets
@@ -18,11 +18,13 @@ import { timeConvert } from '../common/utils/TimeUtils';
import { AvPlayerController } from '../controller/AvPlayerController';
import { SpeedDialog } from './SpeedDialog';
import { ScaleDialog } from './ScaleDialog';
+import { LanguageDialog } from './LanguageDialog';
@Component
export struct VideoOperate {
@State speedSelect: number = 0; // Speed Magnification Selection
- @State windowScaleSelect: number = 0;
+ @State windowScaleSelect: number = 0
+ @State languageSelect: number = 0
@Link currentTime: number;
@Link durationTime: number;
@Link isSwiping: boolean;
@@ -34,6 +36,7 @@ export struct VideoOperate {
@StorageLink('speedName') speedName: Resource = $r('app.string.video_speed_1_0X');
@StorageLink('isMuted') isMuted: boolean = false;
@StorageLink('videoScaleType') videoScaleType: number = media.VideoScaleType.VIDEO_SCALE_TYPE_FIT;
+ @StorageLink('currentLanguageType') currentLanguageType: number = 0;
private dialogController: CustomDialogController = new CustomDialogController({
builder: SpeedDialog({ speedSelect: $speedSelect }),
alignment: DialogAlignment.Center,
@@ -44,133 +47,167 @@ export struct VideoOperate {
alignment: DialogAlignment.Center,
offset: { dx: $r('app.float.size_zero'), dy: $r('app.float.size_down_20') }
});
+ private languageDialogController: CustomDialogController = new CustomDialogController({
+ builder: LanguageDialog({ languageSelect: $languageSelect }),
+ alignment: DialogAlignment.Center,
+ offset: { dx: $r('app.float.size_zero'), dy: $r('app.float.size_down_20') }
+ });
build() {
- Row() {
- Row() {
- Image(this.flag ? $r('app.media.ic_video_play') : $r('app.media.ic_video_pause'))// Play/Pause
- .id('play')
- .width($r('app.float.size_30'))
- .height($r('app.float.size_30'))
- .onClick(() => {
- this.flag ? this.avPlayerController.videoPause() : this.avPlayerController.videoPlay();
- this.flag = !this.flag;
- })
-
- // Left side time
- Text(timeConvert(this.currentTime))
- .fontColor(Color.White)
- .textAlign(TextAlign.End)
- .fontWeight(FontWeight.Regular)
- .margin({ left: $r('app.float.size_5') })
- }
-
+ Column(){
Row() {
- // [Start progress_slider]
+ // [Start video_language_switch_button]
/**
- * Progress slider
+ * Video Language switch
*/
- Slider({
- value: this.currentTime,
- min: 0,
- max: this.durationTime,
- style: SliderStyle.OutSet
+ Button() {
+ Image($r('app.media.ic_video_translate'))
+ .width($r('app.float.size_25'))
+ .height($r('app.float.size_25'))
+ }
+ .type(ButtonType.Normal)
+ .width($r('app.float.size_25'))
+ .height($r('app.float.size_25'))
+ .backgroundColor('rgba(0, 0, 0, 0)')
+ .margin({ left: $r('app.float.size_5') })
+ .fontColor(Color.White)
+ .onClick(() => {
+ this.languageSelect = this.currentLanguageType;
+ this.languageDialogController.open();
})
- .id('Slider')
- .blockColor(Color.White)
- .trackColor(Color.Gray)
- .selectedColor($r('app.color.slider_selected'))
- .showTips(false)
- .onChange((value: number, mode: SliderChangeMode) => {
- if (mode === SliderChangeMode.Begin) {
- this.isSwiping = true;
- this.avPlayerController.videoPause();
- }
- this.avPlayerController.videoSeek(value);
- this.currentTime = value;
- if (mode === SliderChangeMode.End) {
- this.isSwiping = false;
- this.flag = true;
- this.avPlayerController.videoPlay();
- }
- })
- // [End progress_slider]
+
+ // [End video_language_switch_button]
}
- .layoutWeight(1)
+ .width('100%')
+ .padding({ left: $r('app.float.size_12'), right: $r('app.float.size_20') })
+ .justifyContent(FlexAlign.End)
+
Row() {
- // Right side time
- Text(timeConvert(this.durationTime))
- .fontColor(Color.White)
- .fontWeight(FontWeight.Regular)
+ Row() {
+ Image(this.flag ? $r('app.media.ic_video_play') : $r('app.media.ic_video_pause'))// Play/Pause
+ .id('play')
+ .width($r('app.float.size_30'))
+ .height($r('app.float.size_30'))
+ .onClick(() => {
+ this.flag ? this.avPlayerController.videoPause() : this.avPlayerController.videoPlay();
+ this.flag = !this.flag;
+ })
+
+ // Left side time
+ Text(timeConvert(this.currentTime))
+ .fontColor(Color.White)
+ .textAlign(TextAlign.End)
+ .fontWeight(FontWeight.Regular)
+ .margin({ left: $r('app.float.size_5') })
+ }
+
+ Row() {
+ // [Start progress_slider]
+ /**
+ * Progress slider
+ */
+ Slider({
+ value: this.currentTime,
+ min: 0,
+ max: this.durationTime,
+ style: SliderStyle.OutSet
+ })
+ .id('Slider')
+ .blockColor(Color.White)
+ .trackColor(Color.Gray)
+ .selectedColor($r('app.color.slider_selected'))
+ .showTips(false)
+ .onChange((value: number, mode: SliderChangeMode) => {
+ if (mode === SliderChangeMode.Begin) {
+ this.isSwiping = true;
+ this.avPlayerController.videoPause();
+ }
+ this.avPlayerController.videoSeek(value);
+ this.currentTime = value;
+ if (mode === SliderChangeMode.End) {
+ this.isSwiping = false;
+ this.flag = true;
+ this.avPlayerController.videoPlay();
+ }
+ })
+ // [End progress_slider]
+ }
+ .layoutWeight(1)
+ Row() {
+ // Right side time
+ Text(timeConvert(this.durationTime))
+ .fontColor(Color.White)
+ .fontWeight(FontWeight.Regular)
+
+ // [Start video_speed_button]
+ Button(this.speedName, { type: ButtonType.Normal })
+ .border({ width: $r('app.float.size_1'), color: Color.White })
+ .width($r('app.float.size_64'))
+ .height($r('app.float.size_30'))
+ .fontSize($r('app.float.size_15'))
+ .borderRadius($r('app.float.size_20'))
+ .fontColor(Color.White)
+ .backgroundColor('rgba(0, 0, 0, 0)')
+ .opacity($r('app.float.size_1'))
+ .padding({ left: $r('app.float.size_5'), right: $r('app.float.size_5') })
+ .margin({ left: $r('app.float.size_8') })
+ .id('Speed')
+ .onClick(() => {
+ this.speedSelect = this.speedIndex;
+ this.dialogController.open();
+ })
+ // [End video_speed_button]
- // [Start video_speed_button]
- Button(this.speedName, { type: ButtonType.Normal })
- .border({ width: $r('app.float.size_1'), color: Color.White })
- .width($r('app.float.size_64'))
+ // [Start video_muted_button]
+ /**
+ * Video Muted Button
+ */
+ Button() {
+ Image(this.isMuted ? $r('app.media.ic_video_speaker_slash') : $r('app.media.ic_video_speaker'))
+ .width($r('app.float.size_30'))
+ .height($r('app.float.size_30'))
+ }
+ .type(ButtonType.Normal)
+ .width($r('app.float.size_30'))
.height($r('app.float.size_30'))
- .fontSize($r('app.float.size_15'))
.borderRadius($r('app.float.size_20'))
- .fontColor(Color.White)
.backgroundColor('rgba(0, 0, 0, 0)')
- .opacity($r('app.float.size_1'))
- .padding({ left: $r('app.float.size_5'), right: $r('app.float.size_5') })
- .margin({ left: $r('app.float.size_8') })
- .id('Speed')
+ .margin({ left: $r('app.float.size_5') })
+ .fontColor(Color.White)
.onClick(() => {
- this.speedSelect = this.speedIndex;
- this.dialogController.open();
+ this.isMuted = !this.isMuted;
+ this.avPlayerController.videoMuted(this.isMuted)
})
- // [End video_speed_button]
- // [Start video_muted_button]
- /**
- * Video Muted Button
- */
- Button() {
- Image(this.isMuted ? $r('app.media.ic_video_speaker_slash') : $r('app.media.ic_video_speaker'))
- .width($r('app.float.size_30'))
- .height($r('app.float.size_30'))
- }
- .type(ButtonType.Normal)
- .width($r('app.float.size_30'))
- .height($r('app.float.size_30'))
- .borderRadius($r('app.float.size_20'))
- .backgroundColor('rgba(0, 0, 0, 0)')
- .margin({ left: $r('app.float.size_5') })
- .fontColor(Color.White)
- .onClick(() => {
- this.isMuted = !this.isMuted;
- this.avPlayerController.videoMuted(this.isMuted)
- })
+ // [End video_muted_button]
- // [End video_muted_button]
+ // [Start window_scale_button]
+ /**
+ * Window scale button
+ */
+ Button() {
+ Image($r('app.media.ic_video_window_scale'))
+ .width($r('app.float.size_25'))
+ .height($r('app.float.size_25'))
+ }
+ .type(ButtonType.Normal)
+ .width($r('app.float.size_25'))
+ .height($r('app.float.size_25'))
+ .backgroundColor('rgba(0, 0, 0, 0)')
+ .margin({ left: $r('app.float.size_5') })
+ .fontColor(Color.White)
+ .onClick(() => {
+ this.windowScaleSelect = this.videoScaleType;
+ this.scaleDialogController.open();
+ })
- // [Start window_scale_button]
- /**
- * Window scale button
- */
- Button() {
- Image($r('app.media.ic_video_window_scale'))
- .width($r('app.float.size_25'))
- .height($r('app.float.size_25'))
+ // [End window_scale_button]
}
- .type(ButtonType.Normal)
- .width($r('app.float.size_25'))
- .height($r('app.float.size_25'))
- .backgroundColor('rgba(0, 0, 0, 0)')
- .margin({ left: $r('app.float.size_5') })
- .fontColor(Color.White)
- .onClick(() => {
- this.windowScaleSelect = this.videoScaleType;
- this.scaleDialogController.open();
- })
-
- // [End window_scale_button]
}
+ .justifyContent(FlexAlign.Center)
+ .padding({ left: $r('app.float.size_12'), right: $r('app.float.size_20') })
+ .width('100%')
}
- .justifyContent(FlexAlign.Center)
- .padding({ left: $r('app.float.size_12'), right: $r('app.float.size_20') })
- .width('100%')
}
}
\ No newline at end of file
diff --git a/entry/src/main/resources/base/element/string.json b/entry/src/main/resources/base/element/string.json
index da43669..8305975 100644
--- a/entry/src/main/resources/base/element/string.json
+++ b/entry/src/main/resources/base/element/string.json
@@ -79,7 +79,18 @@
{
"name": "local_video",
"value": "Local video"
+ },
+ {
+ "name": "Chinese",
+ "value": "Chinese"
+ },
+ {
+ "name": "English",
+ "value": "English"
+ },
+ {
+ "name": "language_switch",
+ "value": "Language switch"
}
-
]
}
\ No newline at end of file
diff --git a/entry/src/main/resources/en_US/element/string.json b/entry/src/main/resources/en_US/element/string.json
index 07d5d25..8d5ec0f 100644
--- a/entry/src/main/resources/en_US/element/string.json
+++ b/entry/src/main/resources/en_US/element/string.json
@@ -79,6 +79,18 @@
{
"name": "local_video",
"value": "Local video"
+ },
+ {
+ "name": "Chinese",
+ "value": "Chinese"
+ },
+ {
+ "name": "English",
+ "value": "English"
+ },
+ {
+ "name": "language_switch",
+ "value": "Language switch"
}
]
}
\ No newline at end of file
diff --git a/entry/src/main/resources/rawfile/en_captions.srt b/entry/src/main/resources/rawfile/en_captions.srt
new file mode 100644
index 0000000..de756d8
--- /dev/null
+++ b/entry/src/main/resources/rawfile/en_captions.srt
@@ -0,0 +1,47 @@
+1
+00:00:01,000 --> 00:00:03,000
+360° dynamic display of three-dimensional weather
+
+2
+00:00:03,000 --> 00:00:06,000
+Synchronize the real-time meteorological conditions outside the window
+
+3
+00:00:07,000 --> 00:00:10,000
+Thunderstorm warning: lightning effect prompt
+
+4
+00:00:10,000 --> 00:00:12,000
+Dawn Aurora Automatic Color Tone Transition
+
+5
+00:00:12,000 --> 00:00:14,000
+A light touch on the fingertip triggers seasonal sound effects
+
+6
+00:00:14,000 --> 00:00:17,000
+This is the first relatively long subtitle test content
+
+7
+00:00:17,000 --> 00:00:20,000
+This is the second relatively long subtitle test content
+
+8
+00:00:20,000 --> 00:00:23,000
+This is the third relatively long subtitle test content
+
+9
+00:00:23,000 --> 00:00:26,000
+This is the fourth relatively long subtitle test content
+
+10
+00:00:26,000 --> 00:00:29,000
+This is the fifth relatively long subtitle test content
+
+11
+00:00:29,000 --> 00:00:32,000
+This is the sixth relatively long subtitle test content
+
+12
+00:00:32,000 --> 00:00:35,000
+This is the seventh relatively long subtitle test content
\ No newline at end of file
diff --git a/entry/src/main/resources/zh_CN/element/string.json b/entry/src/main/resources/zh_CN/element/string.json
index 5654ae5..b074e3c 100644
--- a/entry/src/main/resources/zh_CN/element/string.json
+++ b/entry/src/main/resources/zh_CN/element/string.json
@@ -79,6 +79,18 @@
{
"name": "local_video",
"value": "本地视频"
+ },
+ {
+ "name": "Chinese",
+ "value": "中文"
+ },
+ {
+ "name": "English",
+ "value": "英文"
+ },
+ {
+ "name": "language_switch",
+ "value": "语言切换"
}
]
}
\ No newline at end of file
--
Gitee
From 025ce25939223b2ed4531e278d5fe8b1527d3b15 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=A9=AC=E9=9B=AA=E8=8E=B9?= <1799939623@qq.com>
Date: Fri, 5 Sep 2025 10:45:40 +0800
Subject: [PATCH 08/25] =?UTF-8?q?=E5=87=86=E5=87=BAfixed?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
entry/src/main/ets/views/ExitVideo.ets | 15 +++------------
1 file changed, 3 insertions(+), 12 deletions(-)
diff --git a/entry/src/main/ets/views/ExitVideo.ets b/entry/src/main/ets/views/ExitVideo.ets
index 894e2bd..eda906c 100644
--- a/entry/src/main/ets/views/ExitVideo.ets
+++ b/entry/src/main/ets/views/ExitVideo.ets
@@ -17,12 +17,14 @@ import { common } from '@kit.AbilityKit';
import { GlobalContext } from '../common/utils/GlobalContext';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { CommonConstants } from '../common/constants/CommonConstants';
+import { AvPlayerController } from '../controller/AvPlayerController';
const TAG = '[ExitVideo]';
@Component
export struct ExitVideo {
@StorageLink('videoName') videoName: Resource = $r('app.string.video_res_1');
+ @StorageLink('avPlayerController') avPlayerController: AvPlayerController = new AvPlayerController();
build() {
Row() {
@@ -37,18 +39,7 @@ export struct ExitVideo {
.justifyContent(FlexAlign.Center)
.backgroundColor($r('app.color.back_button'))
.onClick(() => {
- try {
- const context = GlobalContext.getContext().getObject('context') as (common.UIAbilityContext)
- if (context && typeof context.terminateSelf === 'function') {
- context.terminateSelf()
- } else {
- hilog.error(CommonConstants.LOG_DOMAIN, TAG,
- `terminateSelf method is not available`);
- }
- } catch (err) {
- hilog.error(CommonConstants.LOG_DOMAIN, TAG,
- `terminateSelf failed, code is ${err.code}, message is ${err.message}`);
- }
+ this.avPlayerController.videoRelease()
})
Text(this.videoName)
--
Gitee
From b52260f968bc0176227a2bea136e4f82ec5b3b87 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=A9=AC=E9=9B=AA=E8=8E=B9?= <1799939623@qq.com>
Date: Fri, 5 Sep 2025 10:48:28 +0800
Subject: [PATCH 09/25] =?UTF-8?q?=E5=87=86=E5=87=BAfixed?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
entry/src/main/ets/views/ExitVideo.ets | 7 -------
1 file changed, 7 deletions(-)
diff --git a/entry/src/main/ets/views/ExitVideo.ets b/entry/src/main/ets/views/ExitVideo.ets
index eda906c..b4b5d7e 100644
--- a/entry/src/main/ets/views/ExitVideo.ets
+++ b/entry/src/main/ets/views/ExitVideo.ets
@@ -12,15 +12,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-import { common } from '@kit.AbilityKit';
-import { GlobalContext } from '../common/utils/GlobalContext';
-import { hilog } from '@kit.PerformanceAnalysisKit';
-import { CommonConstants } from '../common/constants/CommonConstants';
import { AvPlayerController } from '../controller/AvPlayerController';
-const TAG = '[ExitVideo]';
-
@Component
export struct ExitVideo {
@StorageLink('videoName') videoName: Resource = $r('app.string.video_res_1');
--
Gitee
From ad5470127af97da09daf63b46591216c2a529a46 Mon Sep 17 00:00:00 2001
From: Administrator <1915530918@qq.com>
Date: Fri, 5 Sep 2025 10:53:09 +0800
Subject: [PATCH 10/25] =?UTF-8?q?add=20=E5=AD=97=E5=B9=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ets/controller/AvPlayerController.ets | 22 +++++++++++-------
.../main/resources/base/media/background.png | Bin 0 -> 91942 bytes
.../main/resources/base/media/foreground.png | Bin 0 -> 8805 bytes
.../resources/base/media/layered_image.json | 7 ++++++
4 files changed, 21 insertions(+), 8 deletions(-)
create mode 100644 entry/src/main/resources/base/media/background.png
create mode 100644 entry/src/main/resources/base/media/foreground.png
create mode 100644 entry/src/main/resources/base/media/layered_image.json
diff --git a/entry/src/main/ets/controller/AvPlayerController.ets b/entry/src/main/ets/controller/AvPlayerController.ets
index e7ac073..f6e3483 100644
--- a/entry/src/main/ets/controller/AvPlayerController.ets
+++ b/entry/src/main/ets/controller/AvPlayerController.ets
@@ -166,7 +166,7 @@ export class AvPlayerController {
`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);
this.avPlayer.reset(); // resets the resources and triggers the idle state
})
- this.subtitleUpdateFunction()
+ this.subtitleUpdateFunction();
this.setStateChangeCallback();
}
@@ -197,7 +197,7 @@ export class AvPlayerController {
`setAVPlayerCallback this.avPlayer.surfaceId = ${this.avPlayer.surfaceId}`);
this.avPlayer.prepare();
break;
- // [EndExclude state]
+ // [EndExclude state]
case 'prepared': // This state machine is reported after the prepare interface is successfully invoked.
hilog.info(CommonConstants.LOG_DOMAIN, TAG, 'setAVPlayerCallback AVPlayer state prepared called.');
this.isReady = true;
@@ -225,10 +225,10 @@ export class AvPlayerController {
this.avPlayer.play(); // Invoke the playback interface to start playback.
}
- this.setVideoSpeed();
+ // this.setVideoSpeed();
// [EndExclude prepared]
break;
- // [StartExclude other_state]
+ // [StartExclude other_state]
case 'playing': // After the play interface is successfully invoked, the state machine is reported.
hilog.info(CommonConstants.LOG_DOMAIN, TAG, 'setAVPlayerCallback AVPlayer state playing called.');
this.isPlaying = true;
@@ -489,6 +489,7 @@ export class AvPlayerController {
}
}
}
+
// [End window_scale_fun]
subtitleUpdateFunction(): void {
@@ -525,10 +526,15 @@ export class AvPlayerController {
return
}
this.curSource.caption = languageSelect === 0 ? 'captions.srt' : 'en_captions.srt'
- let fileDescriptorSub = await this.context.resourceManager.getRawFd(this.curSource.caption);
- this.avPlayer.addSubtitleFromFd(fileDescriptorSub.fd, fileDescriptorSub.offset, fileDescriptorSub.length);
- this.currentCaption = ''
- this.subtitleUpdateFunction()
+
+ if (languageSelect === 0) {
+ this.curSource.caption = 'captions.srt';
+ } else if (languageSelect === 1) {
+ this.curSource.caption = 'en_captions.srt';
+ }
+ this.curSource.seekTime = this.avPlayer.currentTime;
+ await this.avPlayer.reset();
+ this.initAVPlayer(this.curSource, this.surfaceID);
hilog.info(CommonConstants.LOG_DOMAIN, TAG, 'language change');
}
} catch (err) {
diff --git a/entry/src/main/resources/base/media/background.png b/entry/src/main/resources/base/media/background.png
new file mode 100644
index 0000000000000000000000000000000000000000..923f2b3f27e915d6871871deea0420eb45ce102f
GIT binary patch
literal 91942
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