このトピックでは、ApsaraVideo Player SDK for iOSに関するよくある質問に対する回答を提供します。 ApsaraVideo Player SDK for iOSの最新バージョンを使用することを推奨します。 最新バージョンのSDKをダウンロードする方法については、「SDKの概要とダウンロード」をご参照ください。
Xcode14を使用してアプリをパッケージ化してapp Storeに送信しますが、レビュー中にエラーが返されます。 どうすればこれを修正できますか?
ビットコードエラー
問題の説明: Xcode 14を使用してアプリをパッケージ化してapp Storeに送信した後、レビュー中にビットコード関連のエラーが返されます。 例:
ITMS-90482: Invalid Executable - The executable 'xxx.app/Frameworks/alivcffmpeg.framework/alivcffmpeg' contains bitcode.
解決策: xcrun bitcode_stripを使用して、フレームワークからビットコードを削除します。 次のサンプルコードでは、${framework_path} はフレームワークのバイナリファイルパスを示します。
xcrun bitcode_strip ${framework_path} -r -o ${framework_path}
cURLエラー
問題の説明: Xcode 14を使用してアプリをパッケージ化してapp Storeに送信すると、レビュー中にcURLエラーが返されます。 例:
ITMS-90338: Non-public API usage - The app references non-public symbols in Frameworks/AliyunPlayer.framework/AliyunPlayer: _curl_multi_poll, _curl_multi_wakeup. If method names in your source code match the private Apple APIs listed above, altering your method names will help prevent this app from being flagged in future submissions. In addition, note that one or more of the above APIs may be located in a static library that was included with your app. If so, they must be removed. For further information, visit the Technical Support Information at http://developer.apple.com/support/technical/
解決策:
ApsaraVideo Player SDK for iOSのみをプロジェクトに統合する場合は、SDKをV5.4.9.2以降に更新することを推奨します。
ApsaraVideo Player SDK for iOSとショートビデオSDKをプロジェクトに統合する場合、ApsaraVideo Player SDKをV5.4.9.2以降に、AlivcFFmpeg (QuCore-ThirdParty) をV4.3.6に、ショートビデオSDKをV3.26以降に更新することを推奨します。
非公開セレクタエラー
問題の説明: Xcode 14を使用してアプリをパッケージ化してapp Storeに送信すると、レビュー中に非公開セレクターに関連するエラーが返されます。 次の図は、サンプルエラーを示しています。
解決策: このエラーは、Xcode 14の検証バグです。 ほとんどの場合、このエラーが返されるかどうかに関係なく、プロジェクトのビルド後にプロジェクトを公開できます。 プロジェクトを公開できない場合は、Xcode 13を使用してプロジェクトを公開することを推奨します。
プラグインエラー
問題の説明: アプリがパッケージ化され、Xcode 14を使用してapp Storeに送信された後、フレーム挿入用のmpf_filter.frameworkと画像鮮鋭化後の後処理用のvfi_filter.frameworkに関する次のエラーが返されます。
解決策:
エラーメッセージに記載されているプラグインを使用する必要がない場合は、プロジェクトからプラグインを削除することをお勧めします。 これにより、パッケージのサイズが小さくなり、プレーヤーのパフォーマンスが損なわれることはありません。
プロジェクトがこれらのプラグインに依存している場合は、Info.plistファイルの
"Bundle identifier"
キーと値のペアの値から"_"
を削除します。 このファイルは、フレームワークが格納されているディレクトリにあります。 次に、プロジェクトを再コンパイルしてビルドします。ApsaraVideo Player SDKをV5.5.2.0以降に更新します。 ApsaraVideo Player SDK V5.5.2.0以降で、プラグイン名に関連する問題が修正されました。
ApsaraVideo Player SDK for iOSのデモを実行するときに、「Xcode Error PhaseScriptExecutionがゼロ以外の終了コードで失敗しました」というエラーメッセージが表示された場合はどうすればよいですか?
エラーをトラブルシューティングするには、次の手順を実行します。1. プロジェクトディレクトリに移動します。
2. pod deintegrate
を実行します。
3. pod install
を実行します。
ApsaraVideo Player SDKをiOSデバイスに統合した後、Xcodeシミュレーターでアプリをデバッグできますか?
ApsaraVideo Player SDK for iOS
デバッグには実際のiPhoneを使用することをお勧めします。 iOSシミュレーターでデバッグできるのは、iOS V5.4.7.1以降のApsaraVideo Player SDKのみです。 ただし、M1チップを搭載したMacマシン用のiOSシミュレーターでアプリをデバッグすることはできません。
Flutter用ApsaraVideo Player SDK
デバッグには実際のiPhoneを使用することをお勧めします。 Xcode 14を使用してiOSシミュレーターでアプリをコンパイルするときに次の図に示すようなエラーが発生した場合は、
setFilterConfig:
、updateFilterConfig:
、setFilterInvalid:
、およびApsaraVideo Player SDK for Flutterでこれらの操作を呼び出すために使用されるコードをコメントアウトします。
ローカルキャッシュを有効にし、HLSストリームの再生を試みました。 再生が失敗し、HTTPステータスコードの403が返されます。 どうすればこれを修正できますか?
問題の説明: VidAuthメソッドに基づくHTTPライブストリーミング (HLS) ビデオストリームの再生が失敗し、ローカルキャッシュが有効になった後にHTTPステータスコード403が返されます。
原因: ビデオのローカルキャッシュを有効にして、ビデオが完全にキャッシュされる前に再生を停止した場合、再生を再開するときに、以前の再生で使用された認証情報が引き続き使用されます。 この場合、認証は失敗し、HTTPステータスコード403が返されます。
解決策: ApsaraVideo Player SDK V5.5.4.0以降の場合、再生URLに認証パラメーターが含まれているHLSストリームを再生する場合は、AVPConfig.enableStrictAuthMode
を設定して認証モードを指定します。 デフォルトでは、AVPConfig.enableStrictAuthModeはfalseに設定されています。 有効な値:
false: 認証情報をキャッシュします。 ビデオが完全にキャッシュされていない場合、プレーヤーは、キャッシュされていないビデオコンテンツを再生するときに、キャッシュされた認証情報を使用してURL署名リクエストを送信します。 署名付きURLの有効期間が短い場合、再生エラーが発生します。
true: 認証を実行し、ビデオコンテンツをキャッシュしません。 再生ごとにURL署名が必要です。 ネットワーク接続が再生の失敗につながることはありません。
オーディオのプリエンプションが原因でApsaraVideo Player for iOSが期待どおりに機能しない場合はどうすればよいですか?
問題の説明: ApsaraVideo Player SDK for iOSおよびその他のオーディオプレーヤーをプロジェクトに統合しました。 ApsaraVideo Player SDKを使用してビデオを再生すると、無音とフリーズが発生します。
原因: iOSのオーディオコントロールオブジェクトAVAudioSession
はシングルトンです。 すべてのオーディオプレーヤーのAVAudioSessionを同じ値に設定しないと、オーディオプリエンプションが発生する可能性があります。 そのため、ApsaraVideo Player SDK for iOSを使用してビデオを再生することはできません。
解決策: プロジェクト内のすべてのオーディオプレーヤーのAVAudioSession
を同じ値に設定します。 たとえば、アプリケーションのオーディオセッションを再生モードに設定し、他のアプリケーションとのオーディオミキシングを許可します。 ビデオの録画と再生を同時に行う場合は、アプリケーションのオーディオセッションをPlayAndRecord
に設定することもできます。 操作の実行時にエラーが発生した場合、エラーメッセージはerr
変数に格納されます。
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&err];
次に、ApsaraVideo Player SDK for iOSでAVAudioSession
のカスタムデリゲートを設定します。 これにより、プリセットAVAudioSession
ロジックが回避され、オーディオプリエンプションが防止されます。 サンプル設定:
デリゲートを設定します。
[AliPlayer setAudioSessionDelegate:self];
デリゲートのリスナーを構成します。
return TRUE
は、SDKにプリセットAVAudioSession
ロジックが設定されていないことを示します。#pragma mark CicadaAudioSessionDelegate - (BOOL)setActive:(BOOL)active error:(NSError **)outError { return YES; } - (BOOL)setCategory:(NSString *)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError { return YES; } - (BOOL)setCategory:(AVAudioSessionCategory)category mode:(AVAudioSessionMode)mode routeSharingPolicy:(AVAudioSessionRouteSharingPolicy)policy options:(AVAudioSessionCategoryOptions)options error:(NSError **)outError { return YES; }
ApsaraVideo Player SDK for iOSを指すスタックがクラッシュした場合はどうすればよいですか?
ApsaraVideo Player SDK for iOSを指すスタックがクラッシュした場合、次のいずれかの方法を使用して問題を解決できます。
ApsaraVideo Player SDK for iOSを最新バージョンに更新します。 ApsaraVideo Player SDK for iOSは、安定性を向上させるために更新を続けています。 ApsaraVideo Player SDKの最新バージョンを入手する方法の詳細については、「SDKの概要とダウンロード」をご参照ください。
SDKを最新バージョンに更新しても問題が解決しない場合は、トラブルシューティングのためにすべてのクラッシュ情報をAlibaba Cloudテクニカルサポートに提供することを推奨します。 テクニカルサポートへの連絡方法の詳細については、「テクニカルサポートへの連絡」をご参照ください。
ApsaraVideo Player SDK for iOSは再生とキャッシュ機能をサポートしていますか?
いいえ。 ApsaraVideo Player SDK for iOSでローカルキャッシングを有効にして、再生中にビデオファイルをローカルマシンにダウンロードできます。 その後、ApsaraVideo Player SDK for iOSを使用して、ダウンロードしたビデオファイルを再生できます。 ApsaraVideo Player SDKを使用してダウンロード中のファイルを再生することはできません。
ApsaraVideo Player SDK for iOSを使用して、ビデオのバッファリングの進行状況を取得できますか?
はい。 ApsaraVideo Player SDK for iOSでは、バッファリング速度、リアルタイムのレンダリングフレームレート、オーディオとビデオのビットレート、およびダウンリンクビットレートを取得できます。 詳細については、「再生情報の取得」をご参照ください。
現在の再生位置を取得するにはどうすればよいですか?
デフォルトでは、ApsaraVideo Player SDKは500ミリ秒ごとに再生位置に関するコールバックを返します。 再生位置をより頻繁に取得するために、コールバックが返される間隔を短くすることができます。 サンプルコード:
AVPConfig *config = [self.player getConfig];
config.positionTimerIntervalMs = 100; // Change the callback interval. Unit: milliseconds.
[self.player setConfig:config];
/**
@brief: The callback for the current playback position.
@param player: The pointer for the player.
@param position: The current playback position.
*/
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// The current playback position.
long currentPosition = position;
}
ビデオの高さと幅を取得するにはどうすればよいですか?
次のいずれかの方法を使用して、ビデオの高さと幅を取得できます。
方法1: AliPlayerインスタンスでprepareメソッドを呼び出します。 AVPEventPrepareDoneイベントが完了したら、AliPlayerインスタンスの高さと幅を取得します。
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType { if (eventType == AVPEventPrepareDone) { NSLog(@"Width:%d,Height:%d", player.width, player.height); } }
方法2: ビデオサイズが変更されたときにトリガーされるイベントをリッスンします。
- (void)onVideoSizeChanged:(AliPlayer*)player width:(int)width height:(int)height rotation:(int)rotation { NSLog(@"Width:%d,Height:%d", width, height); }
方法3: トラック情報を取得するためのコールバックを設定します。 返された配列のAVPTrackInfoからビデオの幅と高さを取得できます。
説明この方法は、データを取得するためにインターネットを介して要求が送信されるため、ネットワーク品質に大きく依存します。 ビデオの幅と高さを取得するには、方法1または方法2を使用することを推奨します。
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info { for (int i=0; i<info.count; i++) { AVPTrackInfo *trackInfo = info[i]; NSLog(@"Width:%d,Height:%d", trackInfo.videoWidth, trackInfo.videoHeight); } }
ApsaraVideo Playerの実行中にクラッシュが発生した場合はどうすればよいですか?
問題をトラブルシューティングするには、次の手順を実行します。
ApsaraVideo Player SDKでクラッシュが発生していないか確認します。
AliyunPlayer
というプレフィックスが付いたクラッシュスタック名が存在する場合、ApsaraVideo Player SDKでクラッシュが発生します。ApsaraVideo Player SDKを最新バージョンに更新し、問題が修正されたかどうかを確認します。
問題が解決しない場合は、Alibaba Cloudテクニカルサポートにお問い合わせください。 テクニカルサポートに連絡するときに、すべてのスレッドとクラッシュログに関するファイルを準備し、クラッシュシナリオを記述します。 詳細については、「エラーログを取得するにはどうすればよいですか?」をご参照ください。
ApsaraVideo Player V5.4.6.0を使用すると、ビデオプリロード中にアプリケーションが初期化またはクラッシュした場合はどうすればよいですか?
ApsaraVideo Player SDKをV5.4.7.1以降に更新することを推奨します。 パッチバージョンのポッド5.4.6.0-25587639
を使用して、ApsaraVideo Player V5.4.6.0の安定性を向上させることもできます。
ビデオ再生に関するFAQ
フルスクリーン再生を実装するにはどうすればよいですか?
ApsaraVideo Player SDK for iOSは、フルスクリーン再生を実装するためのAPIを提供していません。 全画面再生は、iOSシステムを介して実装する必要があります。 ApsaraVideo Player SDK for iOS V5.5.0.0以降のデモでは、iOS 16.0以降でフルスクリーン再生を有効にする方法を提供します。
サンプルコード:
iOSシステムでフルスクリーン再生を有効にするメソッドを呼び出した後、画面サイズに基づいてAliplayerインスタンスのビューサイズを変更する必要があります。
UIInterfaceOrientation orientation = UIInterfaceOrientationLandscapeLeft; // Rotate the view to enable full-screen playback.
......
// The following sample code applies to iOS 16.0 or later.
if (@available(iOS 16.0, *)) {
@try {
NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects];
UIWindowScene *ws = (UIWindowScene *)array[0];
Class GeometryPreferences = NSClassFromString(@"UIWindowSceneGeometryPreferencesIOS");
id geometryPreferences = [[GeometryPreferences alloc]init];
UIInterfaceOrientationMask orientationMask = UIInterfaceOrientationMaskLandscapeRight;
if (orientation == UIInterfaceOrientationPortrait) {
orientationMask = UIInterfaceOrientationMaskPortrait;
}
[geometryPreferences setValue:@(orientationMask) forKey:@"interfaceOrientations"];
SEL sel_method = NSSelectorFromString(@"requestGeometryUpdateWithPreferences:errorHandler:");
void (^ErrorBlock)(NSError *err) = ^(NSError *err){
NSLog(@"Rotation error:%@", [err debugDescription]);
};
if ([ws respondsToSelector:sel_method]) {
(((void (*)(id, SEL,id,id))[ws methodForSelector:sel_method])(ws, sel_method,geometryPreferences,ErrorBlock));
}
} @catch (NSException *exception) {
NSLog(@"Rotation error:%@", exception.reason);
} @finally {
}
} else { // The following sample code applies to iOS versions earlier than 16.0.
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
SEL selector = NSSelectorFromString(@"setOrientation:");
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:[UIDevice currentDevice]];
[invocation setArgument:&Orientation atIndex:2];
invocation invoke];
}
[[UIApplication sharedApplication]setStatusBarOrientation:orientation animated:YES];
}
ビデオの再生中に黒いバーが表示された場合はどうすればよいですか?
問題をトラブルシューティングするには、次の手順を実行します。
ビデオソースに黒いバーが表示されていないか確認します。
次の操作を呼び出して、プレーヤーのスケーリングモードを変更します。
/* AVP_SCALINGMODE_SCALEASPECTFILL: crops the video to fit the view based on the aspect ratio of the video. AVP_SCALINGMODE_SCALEASPECTFIT: scales in the video based on the aspect ratio of the video. Black bars are displayed in the view. AVP_SCALINGMODE_SCALETOFILL: stretches the video to fill in the view. Image distortion may occur. */ self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;
スケーリングモードを変更しても問題が解決しない場合は、
self.player.playerView
を呼び出し、frame
パラメーターを指定してビューの幅と高さをカスタマイズします。
オーディオのみが再生されているが、ビデオ画像が表示されず、log[AFVTBDecoder] :IOS8VT: throw frame
がログに報告された場合はどうすればよいですか?
問題をトラブルシューティングするには、次の手順を実行します。
別のプレーヤーでビデオを再生し、ビデオにオーディオのみが含まれているかどうかを確認します。
ビデオを別のプレーヤーで再生でき、ビデオのアスペクト比がビデオソースのアスペクト比と異なる場合は、ソフトウェアデコードを使用します。
player.enableHardwareDecoder = NO
通知をクリックしてプレーヤーを開いた後、オーディオのみが再生されているがビデオ画像が表示されない場合はどうすればよいですか?
解決策: UIApplicationStateActive == [[UIApplication sharedApplication] applicationState]
を削除します。
- (AliPlayer *)aliPlayer{
if (!_aliPlayer && UIApplicationStateActive == [[UIApplication sharedApplication] applicationState]) {
_aliPlayer = [[AliPlayer alloc] init];
_aliPlayer.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
_aliPlayer.rate = 1;
_aliPlayer.delegate = self;
_aliPlayer.playerView = self.playerView;
}
return _aliPlayer;
}
ライブストリームを再生するときに -5、IOエラー (Input/Output (I/O))
エラーメッセージが返された場合はどうすればよいですか?
AVPConfigのstartBufferDuration
、highBufferDuration
、およびmaxBufferDuration
のデフォルト値を使用することを推奨します。カスタムバッファとレイテンシの設定があるかどうかを確認します。 詳細については、「バッファーとレイテンシの制御」をご参照ください。
一時停止したビデオの再生を再開すると、ログにI/Oを実行しているオーディオセッションの非アクティブ化。
またはすべてのI/Oを停止または一時停止してから、オーディオセッションを無効にします。
エラーメッセージが表示された場合はどうすればよいですか?
問題の説明: ビデオを一時停止し、オーディオが再生される別の再生ビューに切り替えた後、元に戻すとビデオの再生が失敗します。 さらに、I/Oを実行しているオーディオセッションの非アクティブ化。
すべてのI/Oを停止または一時停止してから、オーディオセッションを無効にします。
エラーメッセージがログに報告されます。
解決策: AudioSessionの設定に競合が存在するかどうかを確認します。 たとえば、オーディオが再生されているページを終了すると、サウンドトラックはまだ占有されています。 これは、オーディオが時間内に無効にされないためである。
AliListPlayerを使用してHLS (M3U8) ビデオを再生するときにエラーが発生した場合はどうすればよいですか?
ApsaraVideo Player SDK V5.4.5.0以前を使用している場合、AliListPlayer
を使用してHLS (M3U8) ビデオを再生することはできません。 ApsaraVideo Player SDK V5.4.5.0以降を使用する場合、HLS (M3U8) ビデオを再生するにはローカルキャッシュを有効にする必要があります。 詳細については、「ローカルキャッシュの設定」をご参照ください。
バックグラウンドでビデオを再生できない場合はどうすればよいですか?
問題の説明: ApsaraVideo Player SDK for iOSは、デモを使用している場合でも、ホームボタンを押した後はバックグラウンドでビデオを再生できません。
解決策:
Xcodeでバックグラウンドデータ収集機能を有効にします。 次の図は例を示しています。
フォアグラウンドイベントとバックグラウンドイベントをリッスンするメソッドを指定した場合は、一時停止メソッドと開始メソッドをコメントアウトします。
// Add a method to listen to the event that the app enters the background. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationEnterBackground) name: UIApplicationWillResignActiveNotification object:nil]; // Call this method when the app is switched to the foreground from the background. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name: UIApplicationDidBecomeActiveNotification object:nil]; // Comment out the pause method. - (void)applicationEnterBackground { // [self.player pause]; } // Comment out the start method. - (void)applicationDidBecomeActive { // [self.player start]; }
シーク機能に関するFAQ
進捗ハンドルがシークポジションからスキップした場合はどうすればよいですか?
原因: 不正確なシークモードがプレーヤーで使用されています。 この場合、ビデオの再生は、目的の位置に最も近いキーフレームから開始されます。
解決策: 正確なシークモードに切り替えます。
正確な探索モードと不正確な探索モードを切り替えるにはどうすればよいですか?
次のサンプルコードは、シークモードを切り替える方法の例を示しています。
// Switch to the inaccurate seeking mode.
[self.player seekToTime:1000 seekMode:AVP_SEEKMODE_INACCURATE];
// Switch to the accurate seeking mode.
[self.player seekToTime:1000 seekMode:AVP_SEEKMODE_ACCURATE];
正確な探索モードが使用されているときに、進捗ハンドルが探索位置からスキップする場合はどうすればよいですか?
原因: 正確なシークは、不正確なシークよりも完了に時間がかかります。 指定された位置と最も近いキーフレームとの間隔が正確なシークモードで許容される最大間隔よりも長い再生位置にシークすると、ApsaraVideo Player SDKは自動的に不正確なシークモードを使用してシーク操作を行います。
解決策: setMaxAccurateSeekDelta操作を呼び出して、正確な探索モードで許可されている探索位置と最も近いキーフレームとの間の最大間隔を設定します。 このように、シーク精度は改善されるが、応答時間はより長くなる。 ビジネス要件に基づいて最大間隔を設定することを推奨します。 サンプルコード:
// Unit: milliseconds.
[self.player setMaxAccurateSeekDelta:100];
キャッシュ再生機能を使用すると、キャッシュが失敗した場合はどうすればよいですか?
onPlayerEventコールバックでキャッシュ失敗の原因を取得します。 次のサンプルコードは、onPlayerEventコールバックを設定する方法の例を示しています。
/**
@brief: The callback for player events.
@param player: The pointer for the player.
@param eventWithString: The type of the player event.
@param description: The description of the player event.
@see AVPEventType
*/
-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
if (eventWithString == EVENT_PLAYER_CACHE_SUCCESS) { // Caching during playback succeeded.
} else if (eventWithString == EVENT_PLAYER_CACHE_ERROR) { // Caching during playback failed.
NSString *errorMsg = description;
}
}
次の項目は、キャッシュエラーの一般的な原因を示しています。
CacheConfigで指定されたサイズとデュレーションは、ビデオのサイズと一致しません。
再生中に停止またはシークする位置は、バッファの外にあります。
ApsaraVideo Player SDK V5.4.4.0にプリロード機能とローカルキャッシュ機能が追加されました。 これらの機能は、再生およびキャッシュ機能と同じ機能を提供します。 プリロード機能とローカルキャッシュ機能の使用を推奨します。 詳細については、「高度な機能」をご参照ください。
ビデオキャッシング中にエラーメッセージencrypt check fail
が返された場合はどうすればよいですか?
セキュアなダウンロードを有効にしている場合は、暗号化検証用のセキュリティファイルがアプリと一致するかどうかを確認します。 セキュリティファイルをダウンロードし、ApsaraVideo SDKが保存されているディレクトリに保存する必要があります。 そうしないと、キャッシュまたはダウンロードが失敗する可能性があります。 詳細については、「ダウンロード設定の設定」および「ビデオダウンロードの設定」をご参照ください。
メディアソースデータを取得するにはどうすればよいですか?
次のサンプルコードは、メディアソースデータを取得する方法の例を示しています。
// Configure the rendering callback.
self.player.renderingDelegate = self;
// Listen to the rendering callback.
- (BOOL)onRenderingFrame:(CicadaFrameInfo*) frameInfo {
if (frameInfo.frameType == Cicada_FrameType_Video) { // The underlying video data.
} else if (frameInfo.frameType == Cicada_FrameType_Audio) { // The underlying audio data.
}
return NO;
}
自動ビットレート切り替えのルールは何ですか?
[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO]
を呼び出して自動ビットレート切り替え機能を有効にすると、ApsaraVideo Player SDKはネットワーク速度を監視します。 ビデオのビットレートは、10秒の平均ネットワーク速度に基づいて、より高いビットレートとより低いビットレートとの間で切り替えられる。 10秒の平均ネットワーク速度が条件を満たさない場合、ビデオビットレートは切り替えられません。
10秒の平均ネットワーク速度がより低いビットレートの条件を満たす場合、キャッシュされたコンテンツの再生が完了した後、ビデオはより低いビットレートに切り替えられます。
10秒の平均ネットワーク速度がより高いビットレートの条件を満たす場合、ビデオはすぐにより高いビットレートに切り替えられます。
再試行ロジックをカスタマイズするにはどうすればよいですか?
15秒後にネットワーク接続がタイムアウトすると、ApsaraVideo Player SDKはネットワークの再接続を試みます。 デフォルトでは、エラーコールバックが発生する前に2回の再試行が実行されます。
再試行ロジックをカスタマイズし、再試行イベントが発生したときに通知を受け取ることができます。 サンプルコード:
AVPConfig *config = [self.player getConfig];
config.networkRetryCount = 0; // The number of retries. In this example, this parameter is set to 0.
[self.player setConfig:config];
/**
@brief: The callback for player events.
@param player: The pointer for the player.
@param eventWithString: The type of the player event.
@param description: The description of the player event.
@see AVPEventType
*/
-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
if (eventWithString == EVENT_PLAYER_NETWORK_RETRY) { // The network connection fails. Try again.
// Configure the retry logic.
}
}
RTSストリームを再生するときに、プロトコルがサポートされていないことを示すエラーメッセージが返された場合はどうすればよいですか?
問題をトラブルシューティングするには、次の手順を実行します。
AliPlayerSDK_iOS、AliPlayerSDK_iOS_ARTC、およびRtsSDKの依存関係が追加されているかどうかを確認します。
ApsaraVideo Playerを使用してリアルタイムストリーミング (RTS) ストリームを再生する前に、AliPlayerSDK_iOS、AliPlayerSDK_iOS_ARTC、およびRtsSDKの依存関係を追加する必要があります。 詳細については、「ネイティブRTS SDK For iOS」をご参照ください。
RTS SDKとApsaraVideo Player SDKのバージョンが一致するかどうかを確認します。
RTS SDKでサポートされているバージョンのApsaraVideo Player SDKを使用する必要があります。 詳しくは、「SDK のダウンロード」をご参照ください。
AliPlayerSDK_iOSとAliPlayerSDK_iOS_ARTCのバージョンが同じかどうかを確認します。 AliPlayerSDK_iOSとAliPlayerSDK_iOS_ARTCには同じバージョンを使用する必要があります。
サムネイル機能を使用するにはどうすればよいですか?
ApsaraVideo Player SDKのサムネイル機能を使用する前に、次の操作を実行してビデオのサムネイルを生成してください。 ApsaraVideo VODコンソールに移動し、スナップショットテンプレートを作成し、スナップショットタイプとしてImage Spriteを選択します。 スナップショットテンプレートに基づいてビデオを処理するワークフローを作成します。 次に、ビデオのスプライトスナップショットが作成されます。 詳細については、「ビデオスナップショット」をご参照ください。 次のサンプルコードは、ApsaraVideo Player SDKのサムネイル機能を使用する方法の例を示しています。
/**
Specifies whether a thumbnail is configured for the track. No thumbnail is displayed if you do not configure a thumbnail.
*/
@property (nonatomic,assign)BOOL trackHasThumbnai;
/**
Create a custom view that displays thumbnails.
*/
@property (nonatomic,strong)UIImageView *thumbnaiView;
/**
@brief: The callback for obtaining the track information.
@param player: The pointer for the player.
@param info: The array of track information. For more information, see AVPTrackInfo.
*/
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
AVPMediaInfo* mediaInfo = [player getMediaInfo];
if ((nil != mediaInfo.thumbnails) && (0 < [mediaInfo.thumbnails count])) {
[self.player setThumbnailUrl:[mediaInfo.thumbnails objectAtIndex:0].URL];
self.trackHasThumbnai = YES;
}else {
self.trackHasThumbnai = NO;
}
}
/**
The callback for changing the playback position on the progress bar.
@param playerView playerView
@param value: The playback position.
*/
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
if (self.trackHasThumbnai) {
[self.player getThumbnail:self.player.duration*value];
}
}
/**
@brief: The callback that is returned when the thumbnail is obtained.
@param positionMs: The specified thumbnail position.
@param fromPos: The playback position from which the thumbnail is used.
@param toPos: The playback position at which the thumbnail is no longer used.
@param image: The pointer for the thumbnail image. NSImage is used for macOS and UIImage is used for iOS.
*/
- (void)onGetThumbnailSuc:(int64_t)positionMs fromPos:(int64_t)fromPos toPos:(int64_t)toPos image:(id)image {
self.thumbnaiView.hidden = NO;
[self.thumbnaiView setImage:(UIImage *)image];
}
/**
@brief: The callback that is returned when the thumbnail fails to be obtained.
@param positionMs: The specified thumbnail position.
*/
- (void)onGetThumbnailFailed:(int64_t)positionMs {
self.thumbnaiView.hidden = YES;
}
注: URLベースの再生を使用する場合、MediaInfoコールバックはonTrackReadyでサポートされていないため、システムは自動的にサムネイルを表示しません。 サムネイルURLを指定することを推奨します。
/**
Specifies whether a thumbnail is configured for the track. No thumbnail is displayed if you do not configure a thumbnail.
*/
@property (nonatomic,assign)BOOL trackHasThumbnai;
/**
Create a custom view that displays thumbnails.
*/
@property (nonatomic,strong)UIImageView *thumbnaiView;
/**
onPrepare
*/
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
if(newStatus == AVPStatusPrepared){
[self.player setThumbnailUrl:[URL];// Specify a thumbnail URL. You can obtain the thumbnail URL in the ApsaraVideo VOD console or by calling API operations.
self.trackHasThumbnai = YES;
}
}
/**
The callback for changing the playback position on the progress bar.
@param playerView playerView
@param value: The playback position.
*/
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
if (self.trackHasThumbnai) {
[self.player getThumbnail:self.player.duration*value];
}
}
/**
@brief: The callback that is returned when the thumbnail is obtained.
@param positionMs: The specified thumbnail position.
@param fromPos: The playback position from which the thumbnail is used.
@param toPos: The playback position at which the thumbnail is no longer used.
@param image: The pointer for the thumbnail image. NSImage is used for macOS and UIImage is used for iOS.
*/
- (void)onGetThumbnailSuc:(int64_t)positionMs fromPos:(int64_t)fromPos toPos:(int64_t)toPos image:(id)image {
self.thumbnaiView.hidden = NO;
[self.thumbnaiView setImage:(UIImage *)image];
}
/**
@brief: The callback that is returned when the thumbnail fails to be obtained.
@param positionMs: The specified thumbnail position.
*/
- (void)onGetThumbnailFailed:(int64_t)positionMs {
self.thumbnaiView.hidden = YES;
}
ビデオ解像度に関するFAQ
ビデオが複数の解像度にトランスコードされている場合、どの解像度がビデオ再生に使用されますか?
デフォルトでは、解像度はFD、LD、SD、HD、2K、4K、ODの順序で使用されます。 ビデオ解像度の詳細については、「メディアアセットのパラメーター」をご参照ください。 ApsaraVideo Player SDKは、ビデオの再生に前述の順序で使用できる最初の解像度を使用します。
ビデオ再生のデフォルト解像度を設定するにはどうすればよいですか?
次のサンプルコードは、デフォルトの解像度を設定する方法の例を示しています。
// Video playback based on VidSts is used in this example.
AVPVidStsSource *stsSource = [[AVPVidStsSource alloc] init];
stsSource.vid = @"<vid>";
stsSource.accessKeyId = @"<accessKeyId>";
stsSource.securityToken = @"<securityToken>";
stsSource.accessKeySecret = @"<accessKeySecret>";
stsSource.quality = @""; // The resolution in which you want to play videos. Valid values: FD, LD, SD, HD, 2K, 4K, and OD.
stsSource.forceQuality = NO; // Specifies whether to forcibly use the specified resolution to play videos. NO: ApsaraVideo Player SDK uses the first resolution that is available in the preceding order for video playback. Yes: ApsaraVideo Player SDK forcibly uses the specified resolution to play videos. If a video in the specified resolution is not available, the video is not played.
同じ解像度の複数のストリームが利用可能な場合、どのストリームが再生されますか?
ApsaraVideo Player SDKは、同じ解像度の複数のストリームが利用可能な場合、トランスコードされた最新のストリームを再生します。
ダウンロードしたビデオに表示されるが、ビデオの再生中に非表示になるように透かしを設定するにはどうすればよいですか?
ビデオを複数の解像度にトランスコードするトランスコードジョブを作成します。 ビデオのウォーターマーキングを解像度で設定し、この解像度をビデオの再生に使用します。 ビデオのダウンロードには他の解像度を使用します。
ビデオを横向きモードで再生できない場合はどうすればよいですか?
ApsaraVideo Player SDK for iOSは、ランドスケープモードでのビデオ再生を有効にする方法を提供していません。 iOSシステムでAPI操作を呼び出し、ビジネス要件に基づいてaliplayer.playerView
でframe
パラメーターを指定して、ランドスケープモードを有効にする必要があります。
エラーログを取得するにはどうすればよいですか?
Alibaba Cloudテクニカルサポートに連絡するときは、トラブルシューティングを容易にするためにエラーログを提供してください。 エラーログを取得するには、次の手順を実行します。
次のいずれかの方法でエラーログを取得します。
エラーログを取得する前に、ログレベルを
LOG_LEVEL_TRACE
に設定することを推奨します。 詳細については、「SDKログの取得」をご参照ください。トラブルシューティングのために生成されたログをAlibaba Cloudテクニカルサポートに提供します。
詳細については、「再生エラーのトラブルシューティング」をご参照ください。