JPEG Görüntü Canlı Yayını
Cihazın JPEG canlı yayın modunu başlatın ve SDK'nın ilettiği her eksiksiz JPEG görüntüsünü ekranda gösterin. Uyumlu level-2 akışları ayrıca Opus sesi ve varsa kod çözümü yapılmış PCM verisi iletebilir.
Ön Koşullar
- Cihaz bağlı ve hazırdır;
LiveStreamingAPIprotokolüne uyar. supportsJPEGImageLiveStreamingdeğeritrueolmalıdır.- Uygulamanız, akışı engellemeden görüntü ve isteğe bağlı ses callback'lerini işleyebilmelidir.
API Referansı
Framework
AIBuds.xcframework
İçe Aktarma
- Swift
- Objective-C
import AIBuds
import UIKit#import <AIBuds/AIBuds-Swift.h>
#import <AIBuds/AIBuds.h>
#import <UIKit/UIKit.h>Özellikler
- Swift
- Objective-C
/// Whether JPEG image live streaming is supported
var supportsJPEGImageLiveStreaming: Bool { get }/// Whether JPEG image live streaming is supported.
@property(nonatomic, readonly) BOOL supportsJPEGImageLiveStreaming;Örnek Yöntemi
- Swift
- Objective-C
/// Start JPEG image live streaming
/// - Parameters:
/// - sessionStartCompletionHandler: Session start completion handler
/// - jpegDataReceivedHandler: JPEG data received handler
/// - opusDataReceivedHandler: Opus audio data received handler (only called for level-2 Ogg/MJPEG+Opus streams)
/// - sessionFinishHandler: Session finish handler
func startJPEGImageLiveStreaming(
withSessionStartCompletionHandler sessionStartCompletionHandler: AIBudsLiveStreamingSessionStartCompletionHandler?,
jpegDataReceivedHandler: AIBudsLiveStreamingJpegDataReceivedHandler?,
opusDataReceivedHandler: AIBudsLiveStreamingOpusAudioDataReceivedHandler?,
sessionFinishHandler: AIBudsLiveStreamingSessionFinishHandler?
)/// Start JPEG image live streaming
/// - Parameters:
/// - sessionStartCompletionHandler: Session start completion handler
/// - jpegDataReceivedHandler: JPEG data received handler
/// - opusDataReceivedHandler: Opus audio data received handler (only called for level-2 Ogg/MJPEG+Opus streams)
/// - sessionFinishHandler: Session finish handler
- (void) startJPEGImageLiveStreamingWithSessionStartCompletionHandler:(AIBudsLiveStreamingSessionStartCompletionHandler _Nullable)sessionStartCompletionHandler
jpegDataReceivedHandler:(AIBudsLiveStreamingJpegDataReceivedHandler _Nullable)jpegDataReceivedHandler
opusDataReceivedHandler:(AIBudsLiveStreamingOpusAudioDataReceivedHandler _Nullable)opusDataReceivedHandler
sessionFinishHandler:(AIBudsLiveStreamingSessionFinishHandler _Nullable)sessionFinishHandler;startJPEGImageLiveStreaming öğesine bakın.
Callback Değerleri
| İşleyici | Değerler | Anlamı |
|---|---|---|
sessionStartCompletionHandler | success, error | Canlı yayın oturumunun başlayıp başlamadığını bildirir. |
jpegDataReceivedHandler | jpegData | Eksiksiz bir JPEG görüntüsünü Data / NSData olarak iletir. |
opusDataReceivedHandler | opusData, decodedPcmAudioData | Uyumlu level-2 akışlarında özgün Opus verisini ve varsa kod çözümü yapılmış PCM sesini iletir. |
sessionFinishHandler | isUserInitiatedStop, error | Oturumun nihai sonucunu ve durdurmanın kullanıcı tarafından başlatılıp başlatılmadığını bildirir. |
Dönüş Değeri
Yöntem doğrudan değer döndürmez. Medya ve yaşam döngüsü sonuçları işleyiciler aracılığıyla iletilir.
Kullanım Örnekleri
- Swift
- Objective-C
guard let streamingDevice = device as? LiveStreamingAPI,
streamingDevice.supportsJPEGImageLiveStreaming
else { return }
streamingDevice.startJPEGImageLiveStreaming(
withSessionStartCompletionHandler: { success, error in
DispatchQueue.main.async {
self.setStreamingActive(success)
if let error { self.show(error) }
}
},
jpegDataReceivedHandler: { jpegData in
// Decode away from the UI update, then assign the image on the main queue.
guard let image = UIImage(data: jpegData) else { return }
DispatchQueue.main.async {
self.imageView.image = image
}
},
opusDataReceivedHandler: { opusData, decodedPcmAudioData in
guard let decodedPcmAudioData, !decodedPcmAudioData.isEmpty else { return }
self.consumePCM(decodedPcmAudioData)
},
sessionFinishHandler: { userStopped, error in
DispatchQueue.main.async {
self.setStreamingActive(false)
self.handleFinish(userStopped: userStopped, error: error)
}
}
)id<AIBudsLiveStreamingAPI> streamingDevice = (id<AIBudsLiveStreamingAPI>)self.device;
if (![streamingDevice conformsToProtocol:@protocol(AIBudsLiveStreamingAPI)] ||
!streamingDevice.supportsJPEGImageLiveStreaming) {
return;
}
__weak typeof(self) weakSelf = self;
[streamingDevice
startJPEGImageLiveStreamingWithSessionStartCompletionHandler:^(BOOL success, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf setStreamingActive:success];
if (error)
[weakSelf showError:error];
});
}
jpegDataReceivedHandler:^(NSData *jpegData) {
UIImage *image = [UIImage imageWithData:jpegData];
if (!image)
return;
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.imageView.image = image;
});
}
opusDataReceivedHandler:^(NSData *opusData, NSData *decodedPcmAudioData) {
if (decodedPcmAudioData.length > 0)
[weakSelf consumePCM:decodedPcmAudioData];
}
sessionFinishHandler:^(BOOL userStopped, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf setStreamingActive:NO];
[weakSelf handleFinishUserStopped:userStopped error:error];
});
}];Hata Yönetimi
- Geçersiz JPEG verisini reddedin; son geçerli görüntüyü değiştirmeyin.
- Ses verisi isteğe bağlıdır. Ses callback'i yalnızca uyumlu akışlarda çağrılır ve kod çözümü yapılmış PCM
nilolabilir. sessionStartCompletionHandlerhatasını başarısız oturum başlangıcı olarak ele alın.sessionFinishHandleriçinde kullanıcı durdurmasıyla kesintiyi ayırın; varsaerrordeğerini kullanın.- SDK’nın sağladığı callback sırasının ötesinde kare kaybı, kare hızı veya sıralama garantisi çıkarmayın.
En İyi Uygulamalar
- Her JPEG karesini saklamayın; gösterilen görüntüyü değiştirin veya sınırlı tampon kullanın.
- Callback birikmesini önlemek için görüntü kod çözme ve kullanıcı arayüzüne atama işlemlerini hafif tutun.
- Yeni oturum başladığında kare sayaçlarını ve sunum durumunu temizleyin.
- Özellikten çıkarken yalnızca görüntü görünümünü gizlemek yerine
stopLiveStreaming()çağırın. - Ses gerekmiyorsa
nildeğeriniopusDataReceivedHandleriçin geçin.
Notlar
- Genel SDK sabit bir JPEG çözünürlüğü veya kare hızı belirtmez.
- JPEG modu
AIBudsLiveStreamoynatma sınıflarını gerektirmez. jpegDataReceivedHandler, ham piksel tamponları yerine sıkıştırılmış JPEG verisi sağlar.- RTMP yayınını ayrı bir
AIBudsLiveStream.LiveStreameryaşam döngüsüyle yönetin. Doğrudan giriş modunuconfigure(outputURL:config:)ile yapılandırın; yalnızca yayın başladıktan sonra JPEG karelerinipushJpegFrame(_:), boş olmayan ve kod çözümü yapılmış PCM'i isepushPcmAudio(_:)ile iletin.