From 437ac1e64e0da945e83ff9739f26f718a7cb4aa0 Mon Sep 17 00:00:00 2001 From: WangJiazhen Date: Wed, 30 Jul 2025 20:15:45 +0800 Subject: [PATCH] =?UTF-8?q?Video=E7=BB=84=E4=BB=B6=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=9B=B4=E5=A4=9A=E5=80=8D=E9=80=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: WangJiazhen --- .../engine/jsEnumStyle.js | 5 +++ .../declarative_frontend/jsview/js_video.cpp | 34 ++++++++++++++++ .../pattern/video/video_pattern.cpp | 2 +- .../render/adapter/media_player_impl.cpp | 5 +++ .../render/adapter/media_player_impl.h | 1 + .../render/adapter/rosen_media_player.cpp | 40 +++++++++++++++++++ .../render/adapter/rosen_media_player.h | 1 + .../core/components_ng/render/media_player.h | 5 +++ 8 files changed, 92 insertions(+), 1 deletion(-) diff --git a/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js b/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js index 054e2b03483..f3c10903bc8 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js +++ b/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js @@ -1369,6 +1369,11 @@ let PlaybackSpeed; PlaybackSpeed.Speed_Forward_1_25_X = '1.25'; PlaybackSpeed.Speed_Forward_1_75_X = '1.75'; PlaybackSpeed.Speed_Forward_2_00_X = '2.00'; + PlaybackSpeed.Speed_Forward_0_50_X = '__Speed_Forward_0_50_X'; + PlaybackSpeed.Speed_Forward_1_50_X = '__Speed_Forward_1_50_X'; + PlaybackSpeed.Speed_Forward_3_00_X = '__Speed_Forward_3_00_X'; + PlaybackSpeed.Speed_Forward_0_25_X = '__Speed_Forward_0_25_X'; + PlaybackSpeed.Speed_Forward_0_125_X = '__Speed_Forward_0_125_X'; })(PlaybackSpeed || (PlaybackSpeed = {})); let MixedMode; diff --git a/frameworks/bridge/declarative_frontend/jsview/js_video.cpp b/frameworks/bridge/declarative_frontend/jsview/js_video.cpp index e3dfc4829f3..09347d21a12 100755 --- a/frameworks/bridge/declarative_frontend/jsview/js_video.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_video.cpp @@ -27,6 +27,32 @@ #endif namespace OHOS::Ace { +constexpr double SPEED_0_75_X = 0.75; +constexpr double SPEED_1_00_X = 1.00; +constexpr double SPEED_1_25_X = 1.25; +constexpr double SPEED_1_75_X = 1.75; +constexpr double SPEED_2_00_X = 2.00; +constexpr double SPEED_0_50_X = 0.50; +constexpr double SPEED_1_50_X = 1.50; +constexpr double SPEED_3_00_X = 3.00; +constexpr double SPEED_0_25_X = 0.25; +constexpr double SPEED_0_125_X = 0.125; + +void StringToSpeedForward(const std::string & value, double &result) +{ + static const std::unordered_map speedForwardMap = { + { "__Speed_Forward_0_50_X", SPEED_0_50_X }, + { "__Speed_Forward_1_50_X", SPEED_1_50_X }, + { "__Speed_Forward_3_00_X", SPEED_3_00_X }, + { "__Speed_Forward_0_25_X", SPEED_0_25_X }, + { "__Speed_Forward_0_125_X", SPEED_0_125_X } + }; + auto it = speedForwardMap.find(value); + if (it != speedForwardMap.end()) { + result = it->second; + } +} + VideoModel* VideoModel::GetInstance() { #ifdef NG_BUILD @@ -83,6 +109,14 @@ void JSVideo::Create(const JSCallbackInfo& info) // Parse the rate, if it is invalid, set it as 1.0. double currentProgressRate = 1.0; ParseJsDouble(currentProgressRateValue, currentProgressRate); + if (!NearEqual(currentProgressRate, SPEED_0_75_X) && !NearEqual(currentProgressRate, SPEED_1_00_X) && + !NearEqual(currentProgressRate, SPEED_1_25_X) && !NearEqual(currentProgressRate, SPEED_1_75_X) && + !NearEqual(currentProgressRate, SPEED_2_00_X)) { + currentProgressRate = 1.0; + } + if (currentProgressRateValue->IsString()) { + StringToSpeedForward(currentProgressRateValue->ToString(), currentProgressRate); + } VideoModel::GetInstance()->SetProgressRate(currentProgressRate); auto aiOptions = videoObj->GetProperty("imageAIOptions"); diff --git a/frameworks/core/components_ng/pattern/video/video_pattern.cpp b/frameworks/core/components_ng/pattern/video/video_pattern.cpp index aba2f1d6b34..deaba35b3b4 100755 --- a/frameworks/core/components_ng/pattern/video/video_pattern.cpp +++ b/frameworks/core/components_ng/pattern/video/video_pattern.cpp @@ -869,7 +869,7 @@ void VideoPattern::UpdateSpeed() bgTaskExecutor.PostTask([weak = WeakClaim(RawPtr(mediaPlayer_)), progress = progressRate_] { auto mediaPlayer = weak.Upgrade(); CHECK_NULL_VOID(mediaPlayer); - mediaPlayer->SetPlaybackSpeed(static_cast(progress)); + mediaPlayer->SetPlaybackSpeedForVideo(static_cast(progress)); }, "ArkUIVideoUpdateSpeed"); } } diff --git a/frameworks/core/components_ng/render/adapter/media_player_impl.cpp b/frameworks/core/components_ng/render/adapter/media_player_impl.cpp index 6bac7575753..ac9988fdbad 100755 --- a/frameworks/core/components_ng/render/adapter/media_player_impl.cpp +++ b/frameworks/core/components_ng/render/adapter/media_player_impl.cpp @@ -229,6 +229,11 @@ int32_t MediaPlayerImpl::SetPlaybackSpeed(float speed) return 0; } +int32_t MediaPlayerImpl::SetPlaybackSpeedForVideo(float speed) +{ + return SetPlaybackSpeed(speed); +} + int32_t MediaPlayerImpl::SetSurface() { CHECK_NULL_RETURN(player_, -1); diff --git a/frameworks/core/components_ng/render/adapter/media_player_impl.h b/frameworks/core/components_ng/render/adapter/media_player_impl.h index 788e9332942..4f2b712ddee 100644 --- a/frameworks/core/components_ng/render/adapter/media_player_impl.h +++ b/frameworks/core/components_ng/render/adapter/media_player_impl.h @@ -43,6 +43,7 @@ public: int32_t GetVideoHeight() override; int32_t SetLooping(bool loop) override; int32_t SetPlaybackSpeed(float speed) override; + int32_t SetPlaybackSpeedForVideo(float speed) override; int32_t SetSurface() override; int32_t PrepareAsync() override; bool IsPlaying() override; diff --git a/frameworks/core/components_ng/render/adapter/rosen_media_player.cpp b/frameworks/core/components_ng/render/adapter/rosen_media_player.cpp index 1ccbd8513da..0067f6329d1 100755 --- a/frameworks/core/components_ng/render/adapter/rosen_media_player.cpp +++ b/frameworks/core/components_ng/render/adapter/rosen_media_player.cpp @@ -30,6 +30,11 @@ constexpr float SPEED_1_00_X = 1.00; constexpr float SPEED_1_25_X = 1.25; constexpr float SPEED_1_75_X = 1.75; constexpr float SPEED_2_00_X = 2.00; +constexpr float SPEED_0_50_X = 0.50; +constexpr float SPEED_1_50_X = 1.50; +constexpr float SPEED_3_00_X = 3.00; +constexpr float SPEED_0_25_X = 0.25; +constexpr float SPEED_0_125_X = 0.125; constexpr uint32_t MEDIA_RESOURCE_MATCH_SIZE = 2; const int32_t RAWFILE_PREFIX_LENGTH = strlen("resource://RAWFILE/"); const std::regex MEDIA_RES_ID_REGEX(R"(^resource://\w+/([0-9]+)\.\w+$)", std::regex::icase); @@ -68,6 +73,35 @@ OHOS::Media::PlaybackRateMode ConvertToMediaPlaybackSpeed(float speed) } return mode; } + +OHOS::Media::PlaybackRateMode ConvertToMediaPlaybackSpeedForVideo(float speed) +{ + OHOS::Media::PlaybackRateMode mode = OHOS::Media::SPEED_FORWARD_1_00_X; + if (NearEqual(speed, SPEED_0_75_X)) { + mode = OHOS::Media::PlaybackRateMode::SPEED_FORWARD_0_75_X; + } else if (NearEqual(speed, SPEED_1_00_X)) { + mode = OHOS::Media::PlaybackRateMode::SPEED_FORWARD_1_00_X; + } else if (NearEqual(speed, SPEED_1_25_X)) { + mode = OHOS::Media::PlaybackRateMode::SPEED_FORWARD_1_25_X; + } else if (NearEqual(speed, SPEED_1_75_X)) { + mode = OHOS::Media::PlaybackRateMode::SPEED_FORWARD_1_75_X; + } else if (NearEqual(speed, SPEED_2_00_X)) { + mode = OHOS::Media::PlaybackRateMode::SPEED_FORWARD_2_00_X; + } else if (NearEqual(speed, SPEED_0_50_X)) { + mode = OHOS::Media::PlaybackRateMode::SPEED_FORWARD_0_50_X; + } else if (NearEqual(speed, SPEED_1_50_X)) { + mode = OHOS::Media::PlaybackRateMode::SPEED_FORWARD_1_50_X; + } else if (NearEqual(speed, SPEED_3_00_X)) { + mode = OHOS::Media::PlaybackRateMode::SPEED_FORWARD_3_00_X; + } else if (NearEqual(speed, SPEED_0_25_X)) { + mode = OHOS::Media::PlaybackRateMode::SPEED_FORWARD_0_25_X; + } else if (NearEqual(speed, SPEED_0_125_X)) { + mode = OHOS::Media::PlaybackRateMode::SPEED_FORWARD_0_125_X; + } else { + LOGW("speed is not supported yet."); + } + return mode; +} } // namespace RosenMediaPlayer::~RosenMediaPlayer() @@ -473,6 +507,12 @@ int32_t RosenMediaPlayer::SetPlaybackSpeed(float speed) return mediaPlayer_->SetPlaybackSpeed(ConvertToMediaPlaybackSpeed(static_cast(speed))); } +int32_t RosenMediaPlayer::SetPlaybackSpeedForVideo(float speed) +{ + CHECK_NULL_RETURN(mediaPlayer_, -1); + return mediaPlayer_->SetPlaybackSpeed(ConvertToMediaPlaybackSpeedForVideo(static_cast(speed))); +} + int32_t RosenMediaPlayer::SetSurface() { CHECK_NULL_RETURN(mediaPlayer_, -1); diff --git a/frameworks/core/components_ng/render/adapter/rosen_media_player.h b/frameworks/core/components_ng/render/adapter/rosen_media_player.h index b6abe2e9503..b7ea2f01dd2 100644 --- a/frameworks/core/components_ng/render/adapter/rosen_media_player.h +++ b/frameworks/core/components_ng/render/adapter/rosen_media_player.h @@ -50,6 +50,7 @@ public: int32_t GetVideoHeight() override; int32_t SetLooping(bool loop) override; int32_t SetPlaybackSpeed(float speed) override; + int32_t SetPlaybackSpeedForVideo(float speed) override; int32_t SetSurface() override; int32_t SetRenderFirstFrame(bool display) override; int32_t PrepareAsync() override; diff --git a/frameworks/core/components_ng/render/media_player.h b/frameworks/core/components_ng/render/media_player.h index 6fa8c8dcc9e..c12123ff642 100644 --- a/frameworks/core/components_ng/render/media_player.h +++ b/frameworks/core/components_ng/render/media_player.h @@ -102,6 +102,11 @@ public: return -1; } + virtual int32_t SetPlaybackSpeedForVideo(float /*speed*/) + { + return -1; + } + virtual int32_t SetSurface() { return -1; -- Gitee