Wie spiele ich Youtube-Videos im ExoPlayer in Android ab?
Lesezeit: 9 Minuten
Amit Prajapati
Ich versuche, YouTube-Videos im Exoplayer abzuspielen, aber hier gibt es einige Verwirrung. Ich weiß nicht, was die DASH-URL ist. Ich habe nur eine echte YouTube-URL wie “https://www.youtube.com/watch?v=v1uyQZNg2vE” , ich habe keine Ahnung, wie man eine Bindestrich-URL aus einer echten URL generiert.
@ MARK002-MAB, ich habe den obigen Code ausprobiert, seine Arbeit funktioniert nur vorübergehend. Er schlägt nach einiger Zeit fehl
– Magesh Pandian
19. April 2017 um 13:27 Uhr
@MARK002-MAB Vielen Dank für Ihre Antwort, ich habe eine YouTube-URL, wie kann ich im Exoplayer spielen
– Magesh Pandian
25. April 2017 um 3:16 Uhr
Würde dies gegen die Nutzungsbedingungen von YouTube verstoßen und dazu führen, dass meine App aus dem Play Store entfernt wird, wenn ich diese Methode verwende?
– MichaelStoddart
27. April 2019 um 10:25 Uhr
@MichaelStoddart Ja. Es ist eine Möglichkeit. Ich habe irgendwo gelesen, dass die Verwendung anderer als der bereitgestellten Methoden eine Verletzung sein kann. Sie gilt für alle Google-Dienste und -APIs.
– MARK002-MAB
27. April 2019 um 10:29 Uhr
Karim Abdell Salam
Ich hatte das gleiche Problem, aber ich habe endlich die einfachste Lösung gefunden und sie funktioniert so gut
und vergessen Sie nicht, die letzte ID durch die Ziel-ID zu ersetzen.
Jetzt werden Sie aufgefordert, eine Datei namens get_video_info ohne Erweiterung herunterzuladen.
Versuchen Sie, diese Datei mit Notepad und so zu öffnen.
Jetzt haben Sie die richtigen Daten, aber Sie können sie nicht lesen, weil sie codiert sind. Sie benötigen einen HTML-Decoder, um diese Daten zu verwenden. Verwenden Sie diesen: http://meyerweb.com/eric/tools/dencoder/
– Fügen Sie einfach Ihre Daten ein und drücken Sie mehrmals decodieren, um sicherzustellen, dass sie gut decodiert werden
Suchen Sie schließlich nach einem Schlüssel namens dashmpd
Funktioniert nicht reason=Invalid+parameters.&status=fail&errorcode=2 das habe ich bekommen
– AkshayT
28. März 2018 um 16:59 Uhr
Hallo @KarimAbdellSalam, können wir Live-Streaming von YouTube im Exoplayer über Ihre Bibliothek abspielen.
– Shafqat Kamal
8. Juli 2020 um 15:25 Uhr
Veraltet und funktioniert nicht mehr.
– Johannes
18. Oktober 2021 um 13:44 Uhr
GAG’sB
Sie müssen die HTTP-Antwort von der YouTube-URL (in Ihrem Fall echte URL) abrufen und dann nach dem Abschnitt “url_encoded_fmt_stream_map” suchen. In diesem Abschnitt erhalten Sie einen URI, der zweimal dekodiert werden muss, um die gesuchte DASH-URL zu erhalten.
Veraltet und funktioniert nicht mehr.
– Johannes
18. Oktober 2021 um 13:48 Uhr
Um YouTube-Videos im Exoplayer abzuspielen, können wir diese Bibliothek verwenden
Das ist die Basis-URL, die ihnen die Video-ID hinzufügt
val YouTubeBase="https://www.youtube.com/watch?v="
das ist Bibliothek verwendet Ich werde eine Schleife verwenden, um die gesamte Videoqualität (420.720.180) zu erhalten, denn wenn das Video die 1080 nicht enthält, funktioniert es nicht mit Ihnen, sodass ich für die gesamte Qualität eine Schleife verwende Wenn es jedoch mehr Qualität gefunden hat, wird es die beste Qualität auswählen. Sie können dies mit einem umgekehrten Array namens iTags bearbeiten, wenn Sie eine niedrige Qualität erhalten möchten
object : YouTubeExtractor(requireContext()) {
override fun onExtractionComplete(
ytFiles: SparseArray<YtFile>?,
videoMeta: VideoMeta?
) {
if (ytFiles != null) {
val iTag = 137//tag of video 1080
val audioTag = 140 //tag m4a audio
// 720, 1080, 480
var videoUrl = ""
val iTags: List<Int> = listOf(22, 137, 18)
for (i in iTags) {
val ytFile = ytFiles.get(i)
if (ytFile != null) {
val downloadUrl = ytFile.url
if (downloadUrl != null && downloadUrl.isNotEmpty()) {
videoUrl = downloadUrl
}
}
}
if (videoUrl == "")
videoUrl = ytFiles[iTag].url
val audioUrl = ytFiles[audioTag].url
val audioSource: MediaSource = ProgressiveMediaSource
.Factory(DefaultHttpDataSource.Factory())
.createMediaSource(MediaItem.fromUri(audioUrl))
val videoSource: MediaSource = ProgressiveMediaSource
.Factory(DefaultHttpDataSource.Factory())
.createMediaSource(MediaItem.fromUri(videoUrl))
player?.setMediaSource(
MergingMediaSource(true, videoSource, audioSource), true
)
}
}
}.extract(youtubeLink)
Das ist mein Code im letzten Projekt, von dem ich hoffe, dass es Ihnen in der verwendeten Bibliothek mit dem Exo-Player helfen kann
package com.hamdy.showtime.ui.ui.video_player
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.google.android.exoplayer2.ExoPlayer
import com.hamdy.showtime.databinding.FragmentVideoPlayerBinding
import at.huber.youtubeExtractor.VideoMeta
import at.huber.youtubeExtractor.YtFile
import android.util.SparseArray
import at.huber.youtubeExtractor.YouTubeExtractor
import com.google.android.exoplayer2.MediaItem
import com.google.android.exoplayer2.Player
import com.google.android.exoplayer2.source.MediaSource
import com.google.android.exoplayer2.source.MergingMediaSource
import com.google.android.exoplayer2.source.ProgressiveMediaSource
import com.google.android.exoplayer2.upstream.DefaultHttpDataSource
import com.google.android.exoplayer2.util.Util
import com.hamdy.showtime.ui.util.YouTubeBase
class VideoPlayerFragment : Fragment(), Player.Listener {
private lateinit var youtubeLink: String
private lateinit var binding: FragmentVideoPlayerBinding
var player: ExoPlayer? = null
private var playWhenReady = true
private var currentWindow = 0
private var playbackPosition = 0L
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentVideoPlayerBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
youtubeLink = YouTubeBase + arguments?.get("url").toString()
initializePlayer()
}
private fun initializePlayer() {
player = ExoPlayer.Builder(requireContext()).build()
binding.videoView.player = player
object : YouTubeExtractor(requireContext()) {
override fun onExtractionComplete(
ytFiles: SparseArray<YtFile>?,
videoMeta: VideoMeta?
) {
if (ytFiles != null) {
val iTag = 137//tag of video 1080
val audioTag = 140 //tag m4a audio
// 720, 1080, 480
var videoUrl = ""
val iTags: List<Int> = listOf(22, 137, 18)
for (i in iTags) {
val ytFile = ytFiles.get(i)
if (ytFile != null) {
val downloadUrl = ytFile.url
if (downloadUrl != null && downloadUrl.isNotEmpty()) {
videoUrl = downloadUrl
}
}
}
if (videoUrl == "")
videoUrl = ytFiles[iTag].url
val audioUrl = ytFiles[audioTag].url
val audioSource: MediaSource = ProgressiveMediaSource
.Factory(DefaultHttpDataSource.Factory())
.createMediaSource(MediaItem.fromUri(audioUrl))
val videoSource: MediaSource = ProgressiveMediaSource
.Factory(DefaultHttpDataSource.Factory())
.createMediaSource(MediaItem.fromUri(videoUrl))
player?.setMediaSource(
MergingMediaSource(true, videoSource, audioSource), true
)
player?.prepare()
player?.playWhenReady = playWhenReady
player?.seekTo(currentWindow, playbackPosition)
player?.addListener(this@VideoPlayerFragment)
}
}
}.extract(youtubeLink)
}
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
if (playbackState == Player.STATE_READY) {
binding.progressBar.visibility = View.INVISIBLE
} else {
binding.progressBar.visibility = View.VISIBLE
}
}
override fun onStart() {
super.onStart()
if (Util.SDK_INT >= 24 || player == null) {
initializePlayer()
}
}
override fun onResume() {
super.onResume()
if (Util.SDK_INT < 24 || player == null) {
initializePlayer()
}
}
override fun onPause() {
if (Util.SDK_INT < 24) releasePlayer()
super.onPause()
}
private fun releasePlayer() {
if (player != null) {
playWhenReady = player!!.playWhenReady
playbackPosition = player!!.currentPosition
currentWindow = player!!.currentMediaItemIndex
player?.release()
player = null
}
}
}
10494700cookie-checkWie spiele ich Youtube-Videos im ExoPlayer in Android ab?yes
Haben Sie es geschafft, die DASH-URL zu generieren?
– Zsolt Boldizsar
16. Juni 2015 um 10:48 Uhr
Gibt es eine gültige Möglichkeit, eine DASH-URL aus der Video-ID zu generieren
– AndroidXP
12. Dezember 2017 um 12:26 Uhr
@SuryaPrakashKushawah Aber ich denke, YouTube erlaubt nicht, Videos zu extrahieren, inoffizielle Lösung.
– Amit Prajapati
19. Dezember 2018 um 9:25 Uhr