google / google/ExoPlayer

How to change FPS for preview

Open
#11,057 5 comments 0 reactions 1 assignee Assigned to @tof-tof View on GitHub
question
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.