How to change FPS for preview
- Dominant language
- Java
- Stars
- 21.9k
- Forks
- 6k
- PR merge metrics
- No merged PRs in 30d
Description
Hi team. I have a video encoder application that supports changing the FPS . I want to let the users of my app to encode a video with lower frame rate. But before encoding, I want to show that on preview.
For example: the input video is 30FPS but I want to show the preview with 5FPS before encoding. I have followed the @krocard 's instruction here https://github.com/google/ExoPlayer/issues/8667#issuecomment-790507081
So I created the `DropMediaCodecVideoRenderer`
```
class DropMediaCodecVideoRenderer :
MediaCodecVideoRenderer {
constructor (
context: Context,
codecAdapterFactory: MediaCodecAdapter.Factory,
mediaCodecSelector: MediaCodecSelector,
allowedJoiningTimeMs: Long,
enableDecoderFallback: Boolean,
eventHandler: Handler,
eventListener: VideoRendererEventListener,
maxDroppedFramesToNotify: Int
) : super(
context,
codecAdapterFactory,
mediaCodecSelector,
allowedJoiningTimeMs,
enableDecoderFallback,
eventHandler,
eventListener,
maxDroppedFramesToNotify
)
private var outputBufferBeforeDownsamplingDropCount = 0
override fun onProcessedOutputBuffer(presentationTimeUs: Long) {
super.onProcessedOutputBuffer(presentationTimeUs)
}
override fun processOutputBuffer(
positionUs: Long,
elapsedRealtimeUs: Long,
codec: MediaCodecAdapter?,
buffer: ByteBuffer?,
bufferIndex: Int,
bufferFlags: Int,
sampleCount: Int,
bufferPresentationTimeUs: Long,
isDecodeOnlyBuffer: Boolean,
isLastBuffer: Boolean,
format: Format
): Boolean {
if (isDecodeOnlyBuffer) return super.processOutputBuffer(
positionUs,
elapsedRealtimeUs,
codec,
buffer,
bufferIndex,
bufferFlags,
sampleCount,
bufferPresentationTimeUs,
true,
isLastBuffer,
format
)
val shouldDrop = ((this.outputBufferBeforeDownsamplingDropCount++) % 6) != 0 // drop 5/6 of frames
return super.processOutputBuffer(
positionUs,
elapsedRealtimeUs,
codec,
buffer,
bufferIndex,
bufferFlags,
sampleCount,
bufferPresentationTimeUs,
shouldDrop,
isLastBuffer,
format
)
}
}
```
`CustomRenderersFactory`
```
class CustomRenderersFactory(context: Context): DefaultRenderersFactory(context) {
override fun buildVideoRenderers(
context: Context,
extensionRendererMode: Int,
mediaCodecSelector: MediaCodecSelector,
enableDecoderFallback: Boolean,
eventHandler: Handler,
eventListener: VideoRendererEventListener,
allowedVideoJoiningTimeMs: Long,
out: java.util.ArrayList
) {
val videoRenderer = DropMediaCodecVideoRenderer(
context,
codecAdapterFactory,
mediaCodecSelector,
allowedVideoJoiningTimeMs,
enableDecoderFallback,
eventHandler,
eventListener,
50
)
out.add(videoRenderer)
}
}
```
`PlayMovieActivity`
```
val exoPlayer = ExoPlayer.Builder(this)
.setTrackSelector(DefaultTrackSelector(this))
.setRenderersFactory(CustomRenderersFactory(this))
.build()
val videoUri = Uri.parse("asset:///video_test2.mp4")
val videoItem = MediaItem.fromUri(videoUri)
exoPlayer.addMediaItem(videoItem)
binding.playerView.player = exoPlayer
// Prepare the player.
exoPlayer.prepare()
exoPlayer.playWhenReady = true
exoPlayer.volume = 0f
// Start the playback.
exoPlayer.play()
```
But all I got is a black screen. Could anyone tell me how to custom the fps in exoplayer for preview?
Contributor guide
Assessment
This issue has not been assessed yet.