HWVC is an efficient video encoding library for Android. Supports software
and hardware
encode.
With it, you can encode a video at any resolution, no longer need to care about camera resolution. Everything is so easy.
- Support seek now.
- Fix player`s life cycle.
- Support add filters to existing videos or cut videos.
- Support video player.
- Support video encoding at any resolution. No need to care about camera resolution.
- Support for add filters to existing videos or cut videos.
- Support RTMP stream.
- Support for changing resolution without restarting the camera.
- Support hard & soft encode.
- Record video & audio. Pack mp4 through MediaMuxer.
- Use OpenGL to render and support filter.
- Supports 40+ filters
- Support beauty filter.
- Support for changing resolution without restarting the camera.
- More features.
If you are building with Gradle, simply add the following code to your project:
- You need to configure your kotlin environment. Project root build.gradle
buildscript {
ext.kotlin_version = '1.2.30'//Latest kotlin version
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
jcenter()
}
}
- Module build.gradle
dependencies {
implementation 'com.lmy.codec:hardwarevideocodec:1.7.3'
implementation 'com.lmy.codec:rtmp:1.7.3'//If you want to use RTMP stream.
}
- For record mp4
class MainActivity : AppCompatActivity() {
private lateinit var mRecorder: VideoRecorderImpl
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val mTextureView = TextureView(this)
setContentView(mTextureView)
mRecorder = VideoRecorderImpl(this).apply {
reset()
setOutputUri("${Environment.getExternalStorageDirectory().absolutePath}/test.mp4")
setOutputSize(720, 1280)//Default 720x1280
setFps(30)
setFilter(getDefaultFilter())
setPreviewDisplay(mTextureView)
}
mRecorder.prepare()
//For recording control
mTextureView.setOnTouchListener { v, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
if (mRecorder.prepared())
mRecorder.start()
}
MotionEvent.ACTION_UP -> {
if (mRecorder.started())
mRecorder.pause()
}
}
true
}
}
private fun getDefaultFilter(): BaseFilter = GroupFilter.create(BeautyV4Filter())
.addSticker(TextSticker().apply {
setText(TextSticker.Text("HWVC", 56f).apply {
x = 0.8f
y = 0.03f
})
})
.addSticker(ImageSticker().apply {
setImage(ImageSticker.Image().apply {
x = 0.03f
y = 0.03f
scale = 1.6f
bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_logo_hwvc)
})
})
override fun onDestroy() {
super.onDestroy()
mRecorder.release()
}
}
- For live
class MainActivity : AppCompatActivity() {
private lateinit var mRecorder: VideoRecorderImpl
private val onStateListener = object : VideoRecorder.OnStateListener {
override fun onStop() {
}
override fun onPrepared(encoder: Encoder) {
mRecorder.start()
}
override fun onRecord(encoder: Encoder, timeUs: Long) {
}
override fun onError(error: Int, msg: String) {
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val mTextureView = TextureView(this)
setContentView(mTextureView)
mRecorder = VideoRecorderImpl(this).apply {
reset()
setOutputUri("rtmp://192.168.16.125:1935/live/livestream")
setOutputSize(720, 1280)//Default 720x1280
setFps(30)
setFilter(getDefaultFilter())//Default NormalFilter
setPreviewDisplay(mTextureView)
setOnStateListener(onStateListener)
}
mRecorder.prepare()
}
private fun getDefaultFilter(): BaseFilter = GroupFilter.create(BeautyV4Filter())
.addSticker(TextSticker().apply {
setText(TextSticker.Text("HWVC", 56f).apply {
x = 0.8f
y = 0.03f
})
})
.addSticker(ImageSticker().apply {
setImage(ImageSticker.Image().apply {
x = 0.03f
y = 0.03f
scale = 1.6f
bitmap = BitmapFactory.decodeResource(resources, R.mipmap.ic_logo_hwvc)
})
})
override fun onDestroy() {
super.onDestroy()
mRecorder.release()
}
}
Please use our issues page to let us know of any problems.
HWVC(HardwareVideoCodec) is GPL-licensed.