This action will force synchronization from OpenHarmony-SIG/ohos_ijkplayer, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
ijkplayer is an FFmpeg-based video player that works in OpenHarmony.
In DevEco Studio, download the dependent SDK. Choose Tools > SDK Manager > OpenHarmony SDK, and download an SDK whose API version is later than 9, with Native selected.
Select RK3568 for the development board. Download the ROM. Select rk3568 as the development board type. Use the latest version.
Download the source code through the Git client, rather than or through the web page.
ohpm install @ohos/ijkplayer
import { IjkMediaPlayer } from "@ohos/ijkplayer";
import type { OnPreparedListener } from "@ohos/ijkplayer";
import type { OnVideoSizeChangedListener } from "@ohos/ijkplayer";
import type { OnCompletionListener } from "@ohos/ijkplayer";
import type { OnBufferingUpdateListener } from "@ohos/ijkplayer";
import type { OnErrorListener } from "@ohos/ijkplayer";
import type { OnInfoListener } from "@ohos/ijkplayer";
import type { OnSeekCompleteListener } from "@ohos/ijkplayer";
import { LogUtils } from "@ohos/ijkplayer";
XComponent({
id: 'xcomponentId',
type: 'surface',
libraryname: 'ijkplayer_napi'
})
.onLoad((context) => {
this.initDelayPlay(context);
})
.onDestroy(() => {
})
.width('100%')
.aspectRatio(this.aspRatio)
let mIjkMediaPlayer = IjkMediaPlayer.getInstance();
// Set the context of the <XComponent> callback.
mIjkMediaPlayer.setContext(this.mContext);
// Set the debug mode.
mIjkMediaPlayer.setDebug(true);
// Initialize configuration.
mIjkMediaPlayer.native_setup();
// Set the video source.
mIjkMediaPlayer.setDataSource(url);
// Set the HTTP request header of the video source.
let headers = new Map([
["user_agent", "Mozilla/5.0 BiliDroid/7.30.0 (bbcallen@gmail.com)"],
["referer", "https://www.bilibili.com"]
]);
mIjkMediaPlayer.setDataSourceHeader(headers);
// Enable accurate seeking. This allows you to move to the keyframe precisely from the seeking point, instead of a keyframe before the seeking point.
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-accurate-seek", "1");
// Size of the buffer for prefetching.
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-buffer-size", "102400");
// Minimum number of frames for stopping prefetching.
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", "100");
// Start preloading.
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", "1");
// Set the buffer size to 0. This is the buffer of the player. The player starts playback when there is data.
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", "0");
// Frame skipping. When the CPU processing is slow, frame skipping is performed to ensure audio-to-video synchronization.
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", "5");
// The maximum cache is 3s. Sometimes, due to unstable network performance, data of several seconds is received in a short period of time.
// To reduce the accumulated latency, packet loss is required on the player.
// This is irrelevant to the third parameter packet-buffering.
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max_cached_duration", "3000");
// Unlimited stream receiving
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", "1");
// Keep screen always on.
mIjkMediaPlayer.setScreenOnWhilePlaying(true);
// Set the timeout.
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", "10000000");
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "connect_timeout", "10000000");
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "listen_timeout", "10000000");
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "addrinfo_timeout", "10000000");
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "dns_cache_timeout", "10000000");
let mOnVideoSizeChangedListener: OnVideoSizeChangedListener = {
onVideoSizeChanged(width: number, height: number, sar_num: number, sar_den: number) {
that.aspRatio = width / height;
LogUtils.getInstance()
.LOGI("setOnVideoSizeChangedListener-->go:" + width + "," + height + "," + sar_num + "," + sar_den)
that.hideLoadIng();
}
}
mIjkMediaPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);
let mOnPreparedListener: OnPreparedListener = {
onPrepared() {
LogUtils.getInstance().LOGI("setOnPreparedListener-->go");
}
}
mIjkMediaPlayer.setOnPreparedListener(mOnPreparedListener);
let mOnCompletionListener: OnCompletionListener = {
onCompletion() {
LogUtils.getInstance().LOGI("OnCompletionListener-->go")
that.currentTime = that.stringForTime(mIjkMediaPlayer.getDuration());
that.progressValue = PROGRESS_MAX_VALUE;
that.stop();
}
}
mIjkMediaPlayer.setOnCompletionListener(mOnCompletionListener);
let mOnBufferingUpdateListener: OnBufferingUpdateListener = {
onBufferingUpdate(percent: number) {
LogUtils.getInstance().LOGI("OnBufferingUpdateListener-->go:" + percent)
}
}
mIjkMediaPlayer.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
let mOnSeekCompleteListener: OnSeekCompleteListener = {
onSeekComplete() {
LogUtils.getInstance().LOGI("OnSeekCompleteListener-->go")
that.startPlayOrResumePlay();
}
}
mIjkMediaPlayer.setOnSeekCompleteListener(mOnSeekCompleteListener);
let mOnInfoListener: OnInfoListener = {
onInfo(what: number, extra: number) {
LogUtils.getInstance().LOGI("OnInfoListener-->go:" + what + "===" + extra)
}
}
mIjkMediaPlayer.setOnInfoListener(mOnInfoListener);
let mOnErrorListener: OnErrorListener = {
onError(what: number, extra: number) {
LogUtils.getInstance().LOGI("OnErrorListener-->go:" + what + "===" + extra)
that.hideLoadIng();
prompt.showToast({
message:"Video playback error."
});
}
}
mIjkMediaPlayer.setOnErrorListener(mOnErrorListener);
mIjkMediaPlayer.setMessageListener();
mIjkMediaPlayer.prepareAsync();
mIjkMediaPlayer.start();
mIjkMediaPlayer.pause();
mIjkMediaPlayer.stop();
mIjkMediaPlayer.reset();
mIjkMediaPlayer.release();
mIjkMediaPlayer.seekTo(msec);
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "soundtouch", "1");
mIjkMediaPlayer.setSpeed("2f");
mIjkMediaPlayer.setScreenOnWhilePlaying(true);
mIjkMediaPlayer.setLoopCount(true);
mIjkMediaPlayer.setVolume(leftVolume, rightVolume);
API | Parameter | Return Value | Description |
---|---|---|---|
setContext | context: object | void | Sets the context of the <XComponent> callback. |
setDebug | open: boolean | void | Specifies whether to enable debugging. |
native_setup | - | void | Initializes the configuration. |
setDataSource | url: string | void | Sets the URL of the video source. |
setDataSourceHeader | headers: Map<string, string> | void | Sets the HTTP request header of the video source. |
setOption | category:string, key: string, value: string | void | Sets preset playback parameters. |
setOptionLong | category:string, key: string, value: string | void | Sets preset playback parameters. |
prepareAsync | - | void | Loads the video. |
start | - | void | Starts video playback. |
stop | - | void | Stops video playback. |
pause | - | void | Pauses video playback. |
reset | - | void | Resets video playback. |
release | - | void | Releases resources. |
seekTo | msec: string | void | Seeks to a specified position. |
setScreenOnWhilePlaying | on: boolean | void | Specifies whether to keep the screen always on. |
setSpeed | speed: string | void | Sets the playback speed. |
getSpeed | - | number | Obtains the playback speed. |
isPlaying | - | boolean | Checks whether the video is playing. |
setOnVideoSizeChangedListener | listener: OnVideoSizeChangedListener | void | Sets the callback listener for obtaining the video width and height. |
setOnPreparedListener | listener: OnPreparedListener | void | Sets the callback listener for when the video is ready. |
setOnInfoListener | listener: OnInfoListener | void | Sets the callback listener for the player status. |
setOnErrorListener | listener: OnErrorListener | void | Sets the callback listener for playback errors. |
setOnBufferingUpdateListener | listener: OnBufferingUpdateListener | void | Sets the buffer callback listener. |
setOnSeekCompleteListener | listener: OnSeekCompleteListener | void | Sets the callback listener for seeking. |
setMessageListener | - | void | Sets the video callback listener for receiving messages from NAPI. |
getVideoWidth | - | number | Obtains the video width. |
getVideoHeight | - | number | Obtains the video height. |
getVideoSarNum | - | number | Obtains the video height. |
getVideoSarDen | - | number | Obtains the video height. |
getDuration | - | number | Obtains the total duration of the video. |
getCurrentPosition | - | number | Obtains the current playback position of the video. |
getAudioSessionId | - | number | Obtains the audio session ID. |
setVolume | leftVolume: string,rightVolume:string | void | Sets the volume. |
setLoopCount | looping: boolean | void | Specifies whether to repeat the playback. |
isLooping | - | boolean | Checks whether the playback is repeated. |
selectTrack | track: string | void | Selects a track. |
deselectTrack | track: string | void | Deselects a track. |
getMediaInfo | - | object | Obtains media information. |
FFmpeg: built on FFmpeg ff4.0--ijk0.8.8--20210426--001 (source code). Build this library with GN. For details, see Compilation and Building Guide. For details about the compilation scripts, see doc/FFmpeg/.
soudtouch: built on soudtouch ijk-r0.1.2-dev (source code). You can build this library with CMake in DevEco Studio. For details about the compilation scripts, see doc/soundtouch.
YUV: built on YUV ijk-r0.2.1-dev (source code). You can build this library with CMake in DevEco Studio. For details about the compilation scripts, see doc/yuv.
ijkplayer has been verified in the following versions:
|---- ijkplayer
| |---- entry # Sample code
| |---- ijkplayer # ijkplayer library folder
| |---- cpp # Native module
| |----- ijkplayer # ijkplayer's internal service
| |----- ijksdl # ijkplayer's internal service
| |----- napi # Encapsulated NAPI
| |----- proxy # Proxy provided for NAPI to call and process ijkplayer's internal services
| |----- third_party # Third-party library dependencies
| |----- utils # Utilities
| |---- ets # ArkTS module
| |----- callback # Video callback
| |----- common # Constants
| |----- utils # Utilities
| |----- IjkMediaPlayer.ets # Exposed interfaces
| |---- README.MD # Instructions for installation and usage
If you find any problem during the use, submit an issue. You can also submit a pull request.
ijkplayer is based on LGPLv2.1 or later.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。