<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jyotish Biswas</title>
    <description>The latest articles on DEV Community by Jyotish Biswas (@jyotish_biswas).</description>
    <link>https://dev.to/jyotish_biswas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1985592%2F12186a12-24b0-424f-bea6-13b6c4d19bdf.jpg</url>
      <title>DEV Community: Jyotish Biswas</title>
      <link>https://dev.to/jyotish_biswas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jyotish_biswas"/>
    <language>en</language>
    <item>
      <title>Need Help Playing m3u8 Link in AVPlayer with AVAssetResourceLoaderDelegate</title>
      <dc:creator>Jyotish Biswas</dc:creator>
      <pubDate>Tue, 27 Aug 2024 08:51:54 +0000</pubDate>
      <link>https://dev.to/jyotish_biswas/need-help-playing-m3u8-link-in-avplayer-with-avassetresourceloaderdelegate-3cbm</link>
      <guid>https://dev.to/jyotish_biswas/need-help-playing-m3u8-link-in-avplayer-with-avassetresourceloaderdelegate-3cbm</guid>
      <description>&lt;p&gt;Question:&lt;/p&gt;

&lt;p&gt;I'm trying to secure my m3u8 streaming link with a token. To achieve this, I'm using &lt;strong&gt;AVAssetResourceLoaderDelegate&lt;/strong&gt; in my SwiftUI app. However, the video doesn't play in AVPlayer when I'm using the AVAssetResourceLoaderDelegate. I can see that data is being received in the &lt;strong&gt;resourceLoader&lt;/strong&gt;, but the player does not start playback.&lt;/p&gt;

&lt;p&gt;Here's the code I'm using:&lt;/p&gt;

&lt;p&gt;`struct VVideoPlayerView: View {&lt;br&gt;
    @State private var player: AVPlayer?&lt;br&gt;
    @EnvironmentObject var pilot: UIPilot&lt;br&gt;
    var body: some View {&lt;br&gt;
        VStack {&lt;br&gt;
            VerticalSpacer(height: 50)&lt;br&gt;
            HStack {&lt;br&gt;
                Image(systemName: "arrow.left")&lt;br&gt;
                    .onTapGesture {&lt;br&gt;
                        pilot.pop()&lt;br&gt;
                    }&lt;br&gt;
                Spacer()&lt;br&gt;
                Text("liveStreamData.titleShort")&lt;br&gt;
                    .font(.poppins(.semibold, size: 18))&lt;br&gt;
                    .lineLimit(1)&lt;br&gt;
                HorizontalSpacer(width: 16)&lt;br&gt;
                Spacer()&lt;br&gt;
            }&lt;br&gt;
            .padding(.horizontal)&lt;br&gt;
            if let player = player {&lt;br&gt;
                VideoPlayer(player: player)&lt;br&gt;
                    .onAppear {&lt;br&gt;
                        player.play()&lt;br&gt;
                    }&lt;br&gt;
                    .onDisappear {&lt;br&gt;
                        player.pause()&lt;br&gt;
                    }&lt;br&gt;
            } else {&lt;br&gt;
                Text("Loading video...")&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
        .onAppear {&lt;br&gt;
            setupPlayer()&lt;br&gt;
        }&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private func setupPlayer() {
    guard let url = URL(string: "https://assets.afcdn.com/video49/20210722/v_645516.m3u8") else {
        print("Invalid URL")
        return
    }
    // Replace the scheme with a custom scheme
    var components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    components?.scheme = "customscheme" // Change the scheme to a custom one
    guard let customURL = components?.url else {
        print("Failed to create custom URL")
        return
    }
    let asset = AVURLAsset(url: customURL)
    // Set the resource loader delegate
    let resourceLoaderDelegate = VideoResourceLoaderDelegate()
    asset.resourceLoader.setDelegate(resourceLoaderDelegate, queue: DispatchQueue.main)
    let playerItem = AVPlayerItem(asset: asset)
    player = AVPlayer(playerItem: playerItem)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;class VideoResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate {&lt;br&gt;
    func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -&amp;gt; Bool {&lt;br&gt;
        guard let url = loadingRequest.request.url else {&lt;br&gt;
            print("Invalid request URL")&lt;br&gt;
            return false&lt;br&gt;
        }&lt;br&gt;
        // Replace the custom scheme with the original HTTP/HTTPS scheme&lt;br&gt;
        var components = URLComponents(url: url, resolvingAgainstBaseURL: false)&lt;br&gt;
        components?.scheme = "https" // Change the scheme back to HTTP/HTTPS&lt;br&gt;
        guard let originalURL = components?.url else {&lt;br&gt;
            print("Failed to convert URL back to HTTPS")&lt;br&gt;
            return false&lt;br&gt;
        }&lt;br&gt;
        // Fetch the data from the original URL&lt;br&gt;
        let urlSession = URLSession.shared&lt;br&gt;
        let task = urlSession.dataTask(with: originalURL) { data, response, error in&lt;br&gt;
            if let error = error {&lt;br&gt;
                print("Error loading resource: (error)")&lt;br&gt;
                loadingRequest.finishLoading(with: error)&lt;br&gt;
                return&lt;br&gt;
            }&lt;br&gt;
            if let data = data, let dataRequest = loadingRequest.dataRequest {&lt;br&gt;
                print("Data loaded: (data.count) bytes")&lt;br&gt;
                dataRequest.respond(with: data)&lt;br&gt;
                loadingRequest.finishLoading()&lt;br&gt;
            } else {&lt;br&gt;
                print("No data received")&lt;br&gt;
                loadingRequest.finishLoading(with: NSError(domain: "VideoResourceLoader", code: -1, userInfo: nil))&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
        task.resume()&lt;br&gt;
        return true&lt;br&gt;
    }&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func resourceLoader(_ resourceLoader: AVAssetResourceLoader, didCancel loadingRequest: AVAssetResourceLoadingRequest) {
    print("Loading request was canceled")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;Problem:&lt;/p&gt;

&lt;p&gt;The video does not play when using AVAssetResourceLoaderDelegate. The data is being loaded correctly as confirmed by the logs, but AVPlayer fails to start playback.&lt;br&gt;
Without the resource loader, the video plays without any issues.&lt;br&gt;
Question:&lt;/p&gt;

&lt;p&gt;What could be causing the player to not play the video when using AVAssetResourceLoaderDelegate?&lt;br&gt;
Are there any additional steps or configurations I need to ensure smooth playback while using a resource loader?&lt;br&gt;
Any help would be greatly appreciated!&lt;/p&gt;

</description>
      <category>ios</category>
      <category>avplayer</category>
      <category>swift</category>
    </item>
  </channel>
</rss>
