iOS プレーヤーインスタンスを作成し、再生ソース、音量、再生速度、解像度切り替え、音声トラック切り替えなどの基本的な再生機能を設定します。
デモを実行してテストするには、ApsaraVideo Player SDK をダウンロードし、手順に従ってコンパイルし、実行してください。
ビデオソースの設定
ApsaraVideo Player SDK for iOS は、ビデオオンデマンド (VOD) とライブストリーム再生の両方をサポートしています。
-
VOD の再生方法:VidAuth (ApsaraVideo VOD ユーザーに推奨)、VidSts、UrlSource、および暗号化再生。
-
ライブストリームの再生方法:UrlSource と暗号化再生。
-
UrlSource は URL からメディアを再生します。VidSts と VidAuth はメディア ID (Vid) を使用してメディアを再生します。
-
サポートされているリージョンについては、「ApsaraVideo VOD のリージョン ID」をご参照ください。
VOD 再生
VidAuth (推奨)
VidAuth を使用して VOD ビデオを再生するには、vid プロパティをメディア ID に、playAuth プロパティを再生認証情報に設定します。
-
メディア ID:メディアファイルをアップロードした後にメディア ID を取得できます。ApsaraVideo VOD コンソールで、[メディアファイル] > [オーディオ/ビデオ] の順に選択します。SearchMedia API を呼び出すこともできます。
-
再生認証情報:GetVideoPlayAuth API を呼び出して再生認証情報を取得します。手動での署名生成を避けるために、ApsaraVideo VOD サーバー側 SDK を統合することを推奨します。例については、OpenAPI Explorer をご参照ください。
ApsaraVideo VOD ユーザーには、VidSts よりも VidAuth を推奨します。VidAuth の方がユーザビリティとセキュリティの点で優れているためです。詳細については、「認証情報方式と STS 方式の比較」をご参照ください。
ApsaraVideo VOD コンソールで HLS 暗号化のパラメーターパススルーを有効にする場合、デフォルトのパラメーター名は MtsHlsUriToken です。詳細については、「HLS 暗号化のパラメーターパススルー」をご参照ください。
AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
authSource.vid = @"Vid"; // 必須。ビデオ ID (VideoId)。
authSource.playAuth = @"<yourPlayAuth>"; // 必須。GetVideoPlayAuth で取得した再生認証情報。
authSource.region = @"regionID"; // SDK V5.5.5.0 以降では非推奨です。プレーヤーはリージョンを自動的に解析します。以前のバージョンでは、このパラメーターは必須です。デフォルト:cn-shanghai。
// authSource.authTimeout = 3600; // オプション。再生 URL の有効期間を秒単位で設定します。この値は、ApsaraVideo VOD コンソールで設定された有効期間を上書きします。デフォルト:3600。再生中に URL の有効期限が切れないように、値がビデオの再生時間より長いことを確認してください。
// ApsaraVideo VOD コンソールで HLS 暗号化のパラメーターパススルーを有効にし、デフォルトのパラメーターが MtsHlsUriToken の場合は、次のように設定します。
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
authSource.playConfig = [vp generatePlayerConfig];
[self.player setAuthSource:authSource];
VidSts
VidSts 再生では、VOD 再生認証情報の代わりに一時的な STS 認証情報を使用します。VidSts を使用して VOD ビデオを再生する前に、STS トークンと AccessKey ペア (AccessKey ID と AccessKey シークレット) を取得します。詳細については、「STS トークンの取得」をご参照ください。
ApsaraVideo VOD コンソールで HLS 暗号化のパラメーターパススルーを有効にする場合、デフォルトのパラメーター名は MtsHlsUriToken です。詳細については、「HLS 暗号化のパラメーターパススルー」をご参照ください。
AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
source.vid = @"Vid"; // 必須。ビデオ ID (VideoId)。
source.region = @"regionID"; // 必須。ApsaraVideo VOD のリージョン。デフォルト:cn-shanghai。
source.securityToken = @"<yourSecurityToken>"; // 必須。AssumeRole で取得した STS トークン。
source.accessKeySecret = @"<yourAccessKeySecret>"; // 必須。STS (AssumeRole) で取得した一時的な AccessKey シークレット。
source.accessKeyId = @"<yourAccessKeyId>"; // 必須。STS (AssumeRole) で取得した一時的な AccessKey ID。
// source.authTimeout = 3600; // オプション。再生 URL の有効期間を秒単位で設定します。この値は、ApsaraVideo VOD コンソールで設定された有効期間を上書きします。デフォルト:3600。再生中に URL の有効期限が切れないように、値がビデオの再生時間より長いことを確認してください。
// ApsaraVideo VOD コンソールで HLS 暗号化のパラメーターパススルーを有効にし、デフォルトのパラメーターが MtsHlsUriToken の場合は、次のように設定します。
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
source.playConfig = [vp generatePlayerConfig];
// 再生ソースを設定します。
[self.player setStsSource:source]
UrlSource
UrlSource を使用して VOD ビデオを再生するには、再生 URL を直接渡します。
-
GetPlayInfo API を呼び出して ApsaraVideo VOD から再生 URL を取得できます。ApsaraVideo VOD サーバー側 SDK を統合することを推奨します。例については、OpenAPI Explorer をご参照ください。
-
ローカルファイルの場合、ファイルへのアクセス権限があることを確認し、
/sdcard/video/sample.mp4やcontent://media/video/123などのフルパスを使用してください。
AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; // 必須。VOD URL、サードパーティ URL、またはローカルファイルパス。
[self.player setUrlSource:urlSource];
暗号化再生
VOD ビデオは、HLS 暗号化、Alibaba Cloud ビデオ暗号化、および DRM 暗号化をサポートしています。再生については、「暗号化されたビデオの再生」をご参照ください。
ライブストリーム再生
ライブストリーム再生については、「標準ライブストリーム再生」をご参照ください。
再生の制御
iOS 向け ApsaraVideo Player SDK には、再生の開始、一時停止、停止、シークを行うためのメソッドが用意されています。
再生の準備
prepare メソッドを呼び出して、動画の再生準備を行います。
[self.player prepare];
準備が完了すると、AVPEventPrepareDone を伴う onPlayerEvent コールバックが呼び出されます。
再生の開始
start メソッドを呼び出して、動画の再生を開始します。
[self.player start];
再生の一時停止
pause メソッドを呼び出して、動画を一時停止します。
[self.player pause];
再生の再開
一時停止後に再生を再開するには、start メソッドを呼び出します。
[self.player start];
特定位置へのシーク
seekToTime を呼び出して、特定の位置にシークします。このメソッドは、ユーザーが進行バーをドラッグする場合や、保存した位置から再生を再開する場合に便利です。
// 特定の位置へシーク (ミリ秒)
// 正確なシーク
[self.player seekToTime:position seekMode:AVP_SEEKMODE_ACCURATE];
// 不正確なシーク
[self.player seekToTime:position seekMode:AVP_SEEKMODE_INACCURATE];
シークモード:
-
正確なシーク (
AVP_SEEKMODE_ACCURATE):正確な位置にシークします。処理は遅くなりますが、精度が高くなります。 -
不正確なシーク (
AVP_SEEKMODE_INACCURATE):最も近いキーフレームにシークします。処理は速くなりますが、精度は下がります。
特定位置からの再生開始
再生中にシークするのではなく、特定の位置から再生を開始するには、prepare を呼び出す前に setStartTime を呼び出します。
// 次回の prepare 呼び出しの開始時刻を設定します (ミリ秒)。
// この設定は、直後の prepare 呼び出しにのみ有効です。prepare が呼び出されると、開始時刻は自動的にクリアされます。
// seekMode:正確なシーク (AVP_SEEKMODE_ACCURATE) または不正確なシーク (AVP_SEEKMODE_INACCURATE)。
[self.player setStartTime:time seekMode:seekMode];
再生の停止
stop メソッドを呼び出して、再生を停止します。
[self.player stop];
プレーヤービューのバインド解除
再生を停止した後、プレーヤーインスタンスを破棄する前に、プレーヤービューをバインド解除してレンダリングリソースを解放し、メモリリークを防止します。
// プレーヤービューをバインド解除
self.player.playerView = nil;
プレーヤーを破棄する前に、プレーヤービューをバインド解除してください。destroy または destroyAsync は内部で stop 処理を実行するため、手動で stop を呼び出す必要はありません。再生終了の推奨シーケンスは、ビューのバインド解除 → destroy / destroyAsync です。
プレーヤーの破棄
リソースを解放するために、プレーヤーを同期または非同期で破棄できます。
// 同期破棄。プレーヤーリソースが解放されるまでブロックします。stop が自動的に呼び出されます。
[self.player destroy];
// 非同期破棄。直ちに戻ります。stop が自動的に呼び出されます。
[self.player destroyAsync];
推奨事項:
-
UI の応答を速くしたい場合は、
destroyAsyncを使用します。 -
非同期で破棄している間は、プレーヤーオブジェクトを操作しないでください。
-
破棄処理には非同期の停止処理が含まれるため、
destroyAsyncの前にstopを呼び出す必要はありません。
プレーヤーイベントの監視
ApsaraVideo Player SDK は、プレーヤーの状態の変更、再生の進行状況、エラー、およびその他のイベントを監視するためのデリゲートコールバックを提供します。
プレーヤーデリゲートの設定
ビューコントローラーで AVPDelegate プロトコルを実装して、プレーヤーのコールバックを受信します。
重要: onError および onPlayerEvent コールバックを実装して、エラーを処理し、プレーヤーの状態の変更を監視します。
@interface SimplePlayerViewController ()<AVPDelegate>
@end
- (void)viewDidLoad {
self.player = [[AliPlayer alloc] init];
self.player.playerView = self.avpPlayerView.playerView;
self.player.delegate = self;
//...
}
/**
@brief プレーヤーエラー発生時のコールバックです。
@param player プレーヤーインスタンス。
@param errorModel エラー詳細です。
*/
- (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel {
// エラーを処理し (アラートの表示など)、再生を停止します。
}
/**
@brief プレーヤーイベントのコールバックです。
@param player プレーヤーインスタンス。
@param eventType イベントのタイプです。詳細は AVPEventType を参照してください。
*/
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType{
switch(eventType){
case AVPEventPrepareDone:{
// メディアの準備が完了し、再生可能になったときに呼び出されます。
}
break;
case AVPEventAutoPlayStart:
// 自動再生が開始したときに呼び出されます。
break;
case AVPEventFirstRenderedStart:
// 最初のフレームがレンダリングされたときに呼び出されます。
break;
case AVPEventCompletion:
// 再生が完了したときに呼び出されます。
break;
case AVPEventLoadingStart:
// バッファリングが開始したときに呼び出されます。
break;
case AVPEventLoadingEnd:
// バッファリングが終了したときに呼び出されます。
break;
case AVPEventSeekEnd:
// シーク操作が完了したときに呼び出されます。
break;
case AVPEventLoopingStart:
// 新しいループが開始したときに呼び出されます。
break;
default:
break;
}
}
/**
@brief 現在の再生位置に関するコールバックです。
@param player プレーヤーインスタンス。
@param position 現在の再生位置 (ミリ秒単位)。
*/
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// プログレスバーを更新します。
}
/**
@brief 現在のバッファリングされた位置に関するコールバックです。
@param player プレーヤーインスタンス。
@param position 現在のバッファリングされた位置 (ミリ秒単位)。
*/
- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// バッファリングの進捗インジケーターを更新します。
}
/**
@brief トラック情報が利用可能になった際のコールバックです。
@param player プレーヤーインスタンス。
@param info 利用可能なストリームに関する AVPTrackInfo オブジェクトの配列です。
*/
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
// 利用可能なビットレート/トラックの情報を取得します。
}
/**
@brief 字幕を表示する際のコールバックです。
@param player プレーヤーインスタンス。
@param index 字幕エントリのインデックス。
@param subtitle 表示する字幕テキスト。
*/
- (void)onSubtitleShow:(AliPlayer*)player index:(int)index subtitle:(NSString *)subtitle {
// 字幕テキストを取得して表示します。
}
/**
@brief 字幕を非表示にする際のコールバックです。
@param player プレーヤーインスタンス。
@param index 表示されていた字幕エントリのインデックス。
*/
- (void)onSubtitleHide:(AliPlayer*)player index:(int)index {
// 字幕を非表示にします。
}
/**
@brief 画面キャプチャのコールバックです。
@param player プレーヤーインスタンス。
@param image キャプチャされたスクリーンショット (UIImage)。
*/
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
// キャプチャした画像をプレビューまたは保存します。
}
/**
@brief トラックの変更が完了した際のコールバックです。
@param player プレーヤーインスタンス。
@param info 新しくアクティブになったトラックの AVPTrackInfo オブジェクトです。
*/
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
// ビットレート/トラックが変更されたことの通知。
}
プレーヤーステータスの変更の監視
onPlayerStatusChanged コールバックは、プレーヤーステータスが変更されたときに呼び出されます。
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
switch (newStatus) {
case AVPStatusIdle:{
// プレーヤーはアイドル状態です。
}
break;
case AVPStatusInitialzed:{
// プレーヤーは初期化済みです。
}
break;
case AVPStatusPrepared:{
// プレーヤーは準備完了です。
}
break;
case AVPStatusStarted:{
// 再生が開始されました。
}
break;
case AVPStatusPaused:{
// 再生が一時停止されました。
}
break;
case AVPStatusStopped:{
// 再生が停止されました。
}
break;
case AVPStatusCompletion:{
// 再生が完了しました。
}
break;
case AVPStatusError:{
// プレーヤーでエラーが発生しました。
}
break;
default:
break;
}
}
ビデオ表示の設定
再生中のビデオのスケーリング、回転、ミラーリングの方法を設定します。
スケーリングモード
SDK は 3 つのスケーリングモードをサポートしています:
// アスペクト比を維持したままビューに合わせてスケーリングします (レターボックス)。
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
// アスペクト比を維持したままビューを埋めるようにスケーリングします (クロッピング)。
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFILL;
// ビューを埋めるように引き伸ばします。アスペクト比は維持されません。画像が歪むことがあります。
self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;
スケーリングモードの設定は、ピクチャーインピクチャー (PiP) モードには適用されません。
回転
指定した角度でビデオを時計回りに回転させます:
// 回転なし
self.player.rotateMode = AVP_ROTATE_0;
// 時計回りに 90 度回転
self.player.rotateMode = AVP_ROTATE_90;
// 時計回りに 180 度回転
self.player.rotateMode = AVP_ROTATE_180;
// 時計回りに 270 度回転
self.player.rotateMode = AVP_ROTATE_270;
ミラーリング
ビデオをミラーリングするには、mirrorMode プロパティを設定します。SDK は、水平ミラーリングと垂直ミラーリングをサポートしています:
// ミラーリングなし
self.player.mirrorMode = AVP_MIRRORMODE_NONE;
// 水平ミラーリング
self.player.mirrorMode = AVP_MIRRORMODE_HORIZONTAL;
// 垂直ミラーリング
self.player.mirrorMode = AVP_MIRRORMODE_VERTICAL;
再生情報の取得
再生中の再生進捗、デュレーション、およびバッファリング進捗を取得します。
再生進捗
現在の再生位置は、 onCurrentPositionUpdate コールバックで返されます。
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// position はミリ秒単位です
NSString *positionString = [NSString stringWithFormat:@"%lld", position];
}
総再生時間
ビデオのロード後 (例: AVPEventPrepareDone イベント後) に、ビデオの総再生時間を取得します。
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventPrepareDone: {
if (self.player.duration >= 0) {
NSString *durationString = [NSString stringWithFormat:@"%lld", self.player.duration];
}
}
break;
default:
break;
}
}
実際の再生時間
実際の再生時間をリアルタイムで取得します。この値には、一時停止中またはバッファリング中の時間は含まれません。
int64_t duration = [player getPlayedDuration];
バッファリング進捗
現在のバッファリング進捗は、 onBufferedPositionUpdate コールバックで返されます。
- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
NSString *bufferPosition = [NSString stringWithFormat:@"%lld", position];
}
リアルタイムレンダリングおよびビットレートメトリクス
レンダリングフレームレート、オーディオビットレート、ビデオビットレート、およびネットワークダウンストリームビットレートをリアルタイムで取得します。
// ビデオレンダリングフレームレート。フロート値を返します。
[self.player getOption:AVP_OPTION_RENDER_FPS]
// ビデオビットレート。bit/s 単位のフロート値を返します。
[self.player getOption:AVP_OPTION_VIDEO_BITRATE]
// オーディオビットレート。bit/s 単位のフロート値を返します。
[self.player getOption:AVP_OPTION_AUDIO_BITRATE]
// ネットワークダウンストリームビットレート。bit/s 単位のフロート値を返します。
[self.player getOption:AVP_OPTION_DOWNLOAD_BITRATE]
音量の管理
再生音量をコントロールし、オーディオをミュートします。
音量の調整
volume を呼び出して、音量を変更します。有効な値は 0 から 2 です。このとき、 1 は元の音量を表します。1 より大きい値はオーディオを増幅し、ノイズが発生する可能性があります。音量は 1 以下に保つことを推奨します。
// 音量を設定します。有効な値: 0 から 2。
self.player.volume = 1.0f;
// 現在の音量を取得します。
self.player.volume
オーディオのミュート
オーディオをミュートまたはミュート解除します。
self.player.muted = YES;
再生速度の設定
ピッチを変更せずに、再生速度を通常の速度の 0.5 倍から 5 倍まで調整します:
// 0.5 の倍数 (例:0.5、1.0、1.5、2.0) の使用を推奨します。
self.player.rate = 1.0f;
解像度の切り替え
詳細なコード例については、API-Example プロジェクトの MultiResolution モジュールをご参照ください。
VidAuth または VidSts ベースの再生
VOD 再生に VidAuth または VidSts を使用する場合、SDK は ApsaraVideo VOD からビデオの解像度情報を自動的に取得します。追加の設定は不要です。
利用可能なビデオトラックの取得
ビデオがロードされた後、onTrackReady コールバックで利用可能な各ビデオトラックのビットレート (trackBitrate) を取得します:
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
for (int i=0; i<info.count; i++) {
AVPTrackInfo* track = [info objectAtIndex:i];
switch (track.trackType) {
case AVPTRACK_TYPE_VIDEO: {
int trackBitrate = track.trackBitrate;
}
break;
}
}
}
解像度の切り替え
目的のトラックのインデックスを指定して selectTrack メソッドを呼び出します:
[self.player selectTrack:index];
解像度切り替えイベントの監視
解像度が切り替えられた後、onTrackChanged コールバックが呼び出されます:
- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
// 解像度が切り替わりました。
}
高速切り替えの有効化
手動で解像度を切り替える際の応答を高速化するために、高速切り替えモードを有効にします:
AVPConfig *config = [self.player getConfig];
config.selectTrackBufferMode = 1;
[self.player setConfig:config];
UrlSource ベースのライブストリーミング
詳細については、「標準ライブストリーム再生」をご参照ください。
ループ再生の有効化
ループ再生を有効にすると、再生が完了したときに動画が先頭から自動的に再開されます。
self.player.loop = YES;
AVPEventLoopingStart イベントは、各ループの開始時にトリガーされます。
- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
switch (eventType) {
case AVPEventLoopingStart:
break;
}
}
オーディオトラックの切り替え
再生中に、異なる言語のオーディオトラックを切り替えます。
サポートされるストリームタイプ
次のストリームタイプは、オーディオトラックの切り替えに対応しています。切り替えの動作は、ストリームタイプによって異なります。
|
ストリームタイプ |
拡張子 |
ビットレート数 |
サブストリームタイプ |
切り替えの動作 |
|
非リストストリーム (MP4) |
.mp4 |
1 |
ビデオトラック 1 つ、複数のオーディオトラックと字幕トラック |
オーディオトラックの切り替えが可能です。 |
|
シングルビットレート混合 HLS |
.m3u8 |
1 |
ビデオトラック 1 つ、複数のオーディオトラックと字幕トラック |
オーディオトラックの切り替えが可能です。 |
|
シングルビットレート HLS |
.m3u8 |
1 |
ビデオ、オーディオ、キャプションのサブストリームは分離されています。 |
オーディオトラックの切り替えが可能です。 |
|
マルチビットレート混合 HLS |
.m3u8 |
n |
異なるビットレートのサブストリーム。各サブストリームにビデオトラック 1 つと複数のオーディオトラック |
サブストリーム間のみ切り替え可能で、サブストリーム内のオーディオトラックは切り替えできません。 |
利用可能なオーディオトラックの取得
オーディオトラック情報が利用可能になると、onSubTrackReady コールバックが呼び出されます:
// onSubTrackReady。 通常は AVPEventPrepareDone イベントの前にトリガーされます。
- (void)onSubTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
// このコールバックがトリガーされた後に getSubMediaInfo を呼び出します。このコールバックより前に呼び出すと、結果は空になります。
AVPMediaInfo* subMediaInfo = [player getSubMediaInfo];
// 利用可能なオーディオトラックを反復処理します
for (int i=0; i<subMediaInfo.tracks.count; i++) {
AVPTrackInfo* track = [subMediaInfo.tracks objectAtIndex:i];
// トラックリストから対象のオーディオトラックを見つけます。
}
}
オーディオトラックの切り替え
別のオーディオトラックに切り替えるには、selectTrack メソッドを呼び出します:
[self.player selectTrack:myTrack.trackIndex accurate:YES]
サムネイルの使用
詳細なコード例については、 API-Example プロジェクトの Thumbnail モジュールをご参照ください。
ビデオサムネイル (スプライトシート) を使用すると、タイムラインをスクラビングする際にビデオコンテンツをプレビューできます。
サムネイルを使用する前に、ビデオのスプライトスナップショットを設定してください。ApsaraVideo VOD コンソールで、スナップショットタイプとして [Image Sprite] を指定したスナップショットテンプレートを作成し、ビデオを処理するワークフローを作成してください。詳細については、「ビデオスナップショット」をご参照ください。
/**
現在のトラックにサムネイルがあるかどうかを示すフラグ。 false の場合、シーク中にサムネイルプレビューは表示されません。
*/
@property (nonatomic, assign) BOOL trackHasThumbnail;
/**
サムネイルプレビュー画像を表示するために使用されるカスタム UIImageView。
*/
@property (nonatomic, strong) UIImageView *thumbnailView;
/**
onPrepare
*/
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
if(newStatus == AVPStatusPrepared){
[self.player setThumbnailUrl:[URL];// プレーヤーの準備が完了したら、サムネイル URL を設定します。
self.trackHasThumbnail = YES;
}
}
/**
プログレススライダーの値が変更されたときにトリガーされるコールバック。
@param playerView プレーヤービューインスタンス。
@param value 新しいプログレス値。
*/
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
if (self.trackHasThumbnail) {
[self.player getThumbnail:self.player.duration*value];
}
}
/**
@brief: サムネイルの取得が成功したときにトリガーされるコールバック。
@param positionMs: サムネイルがリクエストされた時間ポジション (ミリ秒単位)。
@param fromPos: このサムネイルが表すセグメントの開始時間 (ミリ秒単位)。
@param toPos: このサムネイルが表すセグメントの終了時間 (ミリ秒単位)。
@param image: 取得されたサムネイル画像 (iOS では UIImage、 macOS では NSImage)。
*/
- (void)onGetThumbnailSuc:(int64_t)positionMs fromPos:(int64_t)fromPos toPos:(int64_t)toPos image:(id)image {
self.thumbnailView.hidden = NO;
[self.thumbnailView setImage:(UIImage *)image];
}
/**
@brief: サムネイルの取得が失敗したときにトリガーされるコールバック。
@param positionMs: サムネイルリクエストが失敗した時間ポジション (ミリ秒単位)。
*/
- (void)onGetThumbnailFailed:(int64_t)positionMs {
self.thumbnailView.hidden = YES;
}
SDK ログの取得
SDK ログは、開発時のデバッグのため、リクエストのステータス、呼び出し結果、権限リクエストを記録します。SDK には、ログを取得するための 2 つの方法があります。
方法 1:開発ツールコンソールでのログ表示
この方法は、ローカルで問題を再現できる場合に適しています。
-
ログ記録の有効化とログレベルの設定:
// SDK ログを有効化します [AliPlayer setEnableLog:YES]; // ログレベルを設定します。デフォルト値は LOG_LEVEL_INFO です。詳細なトラブルシューティングには LOG_LEVEL_TRACE を使用します。 [AliPlayer setLogCallbackInfo:LOG_LEVEL_TRACE callbackBlock:nil]; -
フレームレベルのログ記録の有効化 (オプション):
// 詳細なトラブルシューティングのためにフレームレベルのログ記録を有効化します // 0: 無効、1: 有効 [AliPlayer setLogOption:FRAME_LEVEL_LOGGING_ENABLED value:value];説明フレームレベルのログ記録は大量のログを生成し、主に再生に関する問題のトラブルシューティングに使用されます。
-
ログの収集:
オプション A:コンソールでログを表示
問題を再現した後、XCode などの開発ツールのコンソールからログを取得します。
オプション B:ログをファイルに書き込む
アプリケーションのサンドボックス内にログファイルのフルパスを設定します。
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentDirectory = [paths objectAtIndex:0]; // カスタムログファイルのパスを定義します。例: `xxxx.log` という名前のファイルを作成します。 NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:@"xxxx.log"];アプリのサンドボックス内のカスタムファイルにログをリダイレクトします:
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout); freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);問題を再現した後、カスタムディレクトリから
.logファイルを取得します。
方法 2:LogCallback によるログ受信
この方法は、デバイスで問題を確実に再現できない場合に使用します。コールバックは、アプリケーションのログチャネルにログをエクスポートします。
-
ログ記録を有効化し、ログレベルを設定します。
// SDK ログを有効化します [AliPlayer setEnableLog:YES]; // ログレベルを設定します。デフォルト値は LOG_LEVEL_INFO です。トラブルシューティングでは、LOG_LEVEL_TRACE に設定します。 [AliPlayer setLogCallbackInfo:LOG_LEVEL_TRACE callbackBlock:^(AVPLogLevel logLevel, NSString *strLog) { NSLog(@"strLog:%@", strLog); }]; -
ログの収集:
問題を再現した後、ログはアプリのロギングシステムに自動的に転送されます。
トラブルシューティング
よくある問題
|
問題 |
考えられる原因 |
解決策 |
|
ビデオが再生されない |
無効な再生ソース |
ビデオ ID または URL が正しいことを確認してください |
|
ブラックスクリーン |
プレーヤービューが設定されていない |
|
|
再生認証情報の有効期限切れ |
トークンの有効期限切れ |
再生認証情報を再生成してリトライしてください |
|
音声のみ再生され、映像が表示されない |
サポートされていないコーデック |
動画フォーマットとコーデックの互換性を確認してください |
|
再生のコマ落ち |
ネットワーク不良 |
アダプティブビットレートストリーミングを有効にするか、画質を下げてください |
参考資料
-
高度な機能:ピクチャーインピクチャー (PiP) 、タイムシフト、アダプティブビットレートストリーミングなどの高度な機能について説明します。
-
API リファレンス: ApsaraVideo Player SDK for iOS の完全な API リファレンスです。
-
モバイルエラーコード:トラブルシューティングは、このトピックを参照してください。