Dynamic Adaptive Streaming over HTTP의 줄임말로 HTTP 프로토콜을 통해 동적으로 적응형 스트리밍을 가능하게 하는 기술입니다. 온라인 미디어 스트리밍에서 가장 큰 문제 중 하나는 네트워크 상태에 따라 스트리밍 품질이 떨어지는 것입니다. DASH는 이러한 문제를 해결하기 위해 개발되었습니다.
DASH는 네트워크 상태에 따라 스트리밍 콘텐츠의 비트레이트를 자동으로 조정하여 최적의 스트리밍 품질을 유지합니다. 이는 네트워크 상태가 좋을때는 높은 품질의 스트리밍을, 네트워크 상태가 나쁠 때는 낮은 품질의 스트리밍을 제공하여 스트리밍 중 끊김이나 버퍼링 문제를 최소화합니다.
위의 기능을 사용하는 곳이 대표적으로 유튜브입니다. 유튜브에서의 동영상을 틀면 네트워크 상태에 따라 (자동)으로 화질을 선택해 영상을 받게됩니다.
추가적으로 말하자면 Android에서는 DASH를 적용하기 위해서는 안드로이드 미디어 플레이어 라이브러리, 예를 들어 Exoplayer 또는 미디어 플레이어 구현 라이브러리 등을 사용하여 DASH를 적용할 수 있습니다.
네트워크 상태에 따라 스트리밍 품질을 자동으로 조정하여 스트리밍 중 끊김이나 버퍼링 문제를 최소화합니다.
HTTP 프로토콜을 사용하여 스트리밍이 가능하므로 프록시, 파이어웨이 등의 제약 없이 스트리밍이 가능합니다.
다양한 디바이스에서 재생이 가능하므로 호환성이 높습니다.
스트리밍 서버와 클라이언트 모두 DASH에 대한 지원이 필요합니다.
처음 설정하는 것이 복잡할 수 있으며 높은 전송률이 필요하며, 네트워크 상태가 좋지 않은 경우 스트리밍 품질이 떨어질 수 있습니다.
implementation 'com.google.android.exoplayer:exoplayer:2.x.x'
@Module
@InstallIn(ActivityComponent::class)
class ExoPlayerModule {
@Provides
fun provideExoPlayer(context: Context): SimpleExoPlayer {
return ExoPlayerFactory.newSimpleInstance(context)
}
}
@HiltViewModel
class PlayerViewModel @Inject constructor(
private val exoPlayer: SimpleExoPlayer
) : ViewModel() {
...
}
@AndroidEntryPoint
class PlayerActivity : AppCompatActivity() {
@Inject
lateinit var exoPlayer: SimpleExoPlayer
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
...
playerView.player = exoPlayer
}
...
}
val dashUrl = "http://url.mpd"
val mediaSource = DashMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(dashUrl))
exoPlayer.prepare(mediaSource)
exoPlayer.playWhenReady = true
다음과 같이 코드를 사용하면 DASH 스트리밍을 재생할 수 있습니다.