Я разрабатываю приложение Flutter, в котором мне нужно воспроизводить видео с рекламой с помощью GSPlayer и Google IMA SDK на iOS. Видео должно начать воспроизводиться автоматически, не требуя вмешательства пользователя. Однако у меня возникли проблемы с автовоспроизведением, особенно с интеграцией рекламы для беспрепятственного воспроизведения до начала основного контента.
Вот краткое описание моей настройки:
Зависимости:
GSPlayer для воспроизведения видео.
< li>GoogleInteractiveMediaAds для обработки видеорекламы.
Цель:
< /ol>
Автоматически загружать и воспроизводить рекламу перед основным видеоконтентом.
Автоматически начинать воспроизведение видео после завершения рекламы.
Автоматически загружать и воспроизводить рекламу перед основным видеоконтентом.
Автоматически запускать воспроизведение видео после завершения показа рекламы.
Автоматически загружать и воспроизводить рекламу перед основным видеоконтентом.
Автоматически начинать воспроизведение видео после завершения рекламы.
Автоматически загружать и воспроизводить рекламу перед основным видеоконтентом.
Автоматически запускать воспроизведение видео после показа рекламы.
li>
Обеспечите плавный переход между рекламой и основным видеоконтентом.
Проблема:
Видео не запускается автоматически.
Рекламы нет. воспроизводите как положено перед основным контентом.
Проблема:
Видео не запускается автоматически, а реклама не воспроизводится должным образом перед основным контентом. Хотя если пользователь нажимает кнопку воспроизведения, все работает как положено.
Я пробовал много вещей, но ничего не работает.
Убедились, что URL-адреса видео и объявлений действительны.
Я разрабатываю приложение Flutter, в котором мне нужно воспроизводить видео с рекламой с помощью GSPlayer и Google IMA SDK на iOS. Видео должно начать воспроизводиться автоматически, не требуя вмешательства пользователя. Однако у меня возникли проблемы с автовоспроизведением, особенно с интеграцией рекламы для беспрепятственного воспроизведения до начала основного контента. Вот краткое описание моей настройки: [list] [*]Зависимости: [/list] [list] [*]GSPlayer для воспроизведения видео. < li>GoogleInteractiveMediaAds для обработки видеорекламы. [/list] [list] [*]Цель: < /ol> [list] [*]Автоматически загружать и воспроизводить рекламу перед основным видеоконтентом. [*]Автоматически начинать воспроизведение видео после завершения рекламы.[/list]
Автоматически загружать и воспроизводить рекламу перед основным видеоконтентом. [*]Автоматически запускать воспроизведение видео после завершения показа рекламы.
Автоматически загружать и воспроизводить рекламу перед основным видеоконтентом. [*]Автоматически начинать воспроизведение видео после завершения рекламы.
Автоматически загружать и воспроизводить рекламу перед основным видеоконтентом. [*]Автоматически запускать воспроизведение видео после показа рекламы.
li> Обеспечите плавный переход между рекламой и основным видеоконтентом. [/list] [list] [*] Проблема: [/list] [list] [*]Видео не запускается автоматически. [*]Рекламы нет. воспроизводите как положено перед основным контентом. [/list] [code] import Foundation import GoogleInteractiveMediaAds import GSPlayer import Flutter
class NativeViewFactory : NSObject, FlutterPlatformViewFactory { private var messenger: FlutterBinaryMessenger
public class NativeView : NSObject, FlutterPlatformView,fullScreeenDelegate, IMAAdsLoaderDelegate, IMAAdsManagerDelegate {
deinit{ stopTimer() playerView.pause() }
private var _view: UIView var kTestAppContentUrl_MP4 = " "
var settings = UIButton()
var playerView = VideoPlayerView() var controlView = GSPlayerControlUIView()
var paybackSlider = UISlider()
var contentPlayhead: IMAAVPlayerContentPlayhead? var adsLoader: IMAAdsLoader! var adsManager: IMAAdsManager! let appDelegate = UIApplication.shared.delegate as! AppDelegate let controller = UIApplication.topViewController()
var item : AVPlayerItem!
var message : FlutterBinaryMessenger! weak var timer: Timer?
func startTimer() { timer?.invalidate() // just in case you had existing `Timer`, `invalidate` it before we lose our reference to it timer = Timer.scheduledTimer(withTimeInterval: 4, repeats: true) { [weak self] _ in self?.controlView.isHidden = true } }
@objc func contentDidFinishPlaying(_ notification: Notification) { // Make sure we don't call contentComplete as a result of an ad completing. // if (notification.object as! AVPlayerItem) == playerView.playerLayer.player?.currentItem { // adsLoader.contentComplete() // } }
func requestAds(view _view: UIView) { // Create ad display container for ad rendering. let adDisplayContainer = IMAAdDisplayContainer( adContainer: _view, viewController: controller, companionSlots: nil) // Create an ad request with our ad tag, display container, and optional user context. let request = IMAAdsRequest( adTagUrl: NativeView.kTestAppAdTagUrl, adDisplayContainer: adDisplayContainer, contentPlayhead: contentPlayhead, userContext: controlView)
public func adsLoader(_ loader: IMAAdsLoader, adsLoadedWith adsLoadedData: IMAAdsLoadedData) { // Grab the instance of the IMAAdsManager and set ourselves as the delegate. adsManager = adsLoadedData.adsManager adsManager.delegate = self
// Create ads rendering settings and tell the SDK to use the in-app browser. let adsRenderingSettings = IMAAdsRenderingSettings() adsRenderingSettings.linkOpenerPresentingController = controller
// Initialize the ads manager. adsManager.initialize(with: adsRenderingSettings)
public func adsManager(_ adsManager: IMAAdsManager, didReceive event: IMAAdEvent) { if event.type == IMAAdEventType.LOADED { // When the SDK notifies us that ads have been loaded, play them. adsManager.start() } if event.type == IMAAdEventType.RESUME {
if event.type == IMAAdEventType.TAPPED { // You can also add allow the user to tap anywhere on the Ad to resume play if(!adsManager.adPlaybackInfo.isPlaying) { adsManager.resume() } }
}
public func adsManager(_ adsManager: IMAAdsManager, didReceive error: IMAAdError) { // Something went wrong with the ads manager after ads were loaded. Log the error and play the // content. print("AdsManager error: \(error.message ?? "nil")") playerView.resume() controlView.isHidden = false
}
public func adsManagerDidRequestContentPause(_ adsManager: IMAAdsManager) { // The SDK is going to play ads, so pause the content. playerView.pause(reason: .userInteraction) controlView.isHidden = true
}
public func adsManagerDidRequestContentResume(_ adsManager: IMAAdsManager) { // The SDK is done playing ads (at least for now), so resume the content. print("AdsManager resume: \("nil")") playerView.resume() controlView.isHidden = false
} }
extension UIApplication { class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { if let navigationController = controller as? UINavigationController { return topViewController(controller: navigationController.visibleViewController) } if let tabController = controller as? UITabBarController { if let selected = tabController.selectedViewController { return topViewController(controller: selected) } } if let presented = controller?.presentedViewController { return topViewController(controller: presented) } return controller } } [/code] и GSPlayerControlUIView.swift: [code]import UIKit import CoreMedia import GSPlayer import Flutter import MediaPlayer
protocol fullScreeenDelegate: class { func fullScreenTap() func normalScreenTap() func backButtonTap()
}
@IBDesignable class GSPlayerControlUIView: UIView {
// MARK: IBOutlet @IBOutlet weak var play_Button: UIButton! @IBOutlet weak var duration_Slider: UISlider! @IBOutlet weak var currentDuration_Label: UILabel! @IBOutlet weak var totalDuration_Label: UILabel! @IBOutlet weak var fullscreen_Button : UIButton! @IBOutlet weak var backButton: UIButton! @IBOutlet weak var volume_Slider: UISlider! @IBOutlet weak var brightness_Slider: UISlider!
weak var delegate: fullScreeenDelegate? var isFullScreen = false
// MARK: Variables private var videoPlayer: VideoPlayerView!
// MARK: Listeners var onStateDidChanged: ((VideoPlayerView.State) -> Void)?
@IBAction func onValueChanged_DurationSlider(_ sender: UISlider) { videoPlayer.seek(to: CMTime(seconds: Double(sender.value), preferredTimescale: 60)) } } [/code] Проблема: Видео не запускается автоматически, а реклама не воспроизводится должным образом перед основным контентом. Хотя если пользователь нажимает кнопку воспроизведения, все работает как положено. Я пробовал много вещей, но ничего не работает. [list] [*]Убедились, что URL-адреса видео и объявлений действительны. [*]Проверили настройкуadsLoader иadsManager. [/list]
В Flutter iOS у нас есть проблемы в реализации рекламы IMA, она не будет работать для iOS, мы используем Player Plus Plus. Если у вас есть какое -либо решение, поэтому, пожалуйста, предоставьте.
В Flutter iOS у нас есть проблемы в реализации рекламы IMA, она не будет работать для iOS, мы используем Player Plus Plus. Если у вас есть какое -либо решение, поэтому, пожалуйста, предоставьте.
Я разрабатываю приложение со структурой PipView (картинка в картинке), похожей на YouTube, для прямых трансляций. Приложение аварийно завершает работу при переходе с вкладки прямой трансляции на PipView, если выполнить следующие действия:...