Crop video before encoding with MediaCodec for Grafika's Continuous Capture Activity
Take a look at the "texture from camera" activity. Note it allows you to manipulate the image in various ways, notably "zoom". The "zoom" is done by modifying the texture coordinates.
The ScaledDrawable2D class does this; the setScale()
call changes the "zoom", rather than scaling the rect itself. Texture coordinates range from 0.0 to 1.0 inclusive, and the getTexCoordArray()
method modifies them to span a subset of the texture.
To clip the frames, you'd need to modify the texture coordinates proportionally. For example, if the input video is portrait 720x1280, and you want 720x720, you would change the coordinates from this:
[0.0, 0.0] [1.0, 0.0]
[0.0, 1.0] [1.0, 1.0]
to this:
[0.0, 280/1280.0] [1.0, 280/1280.0]
[0.0, 1000/1280.0] [1.0, 1000/1280.0]
and then render that on a square rather than a rectangle.
Record video with MediaCodec and MediaMuxer, but the bitrate and framerate are incorrect
It looks like your expected frame rate (19fps) doesn't match the actual frame rate (30fps). The encoder is attempting to meet the bit rate requirements for frames submitted at 19fps, but they're coming in faster, so it misses and the actual bit rate is higher. I'm assuming the 30fps value is determined from the actual presentation time stamps in the video file, which are set by the presentation time stamps passed into MediaMuxer. If you want 19fps video, you need to generate time stamps that are (1000/19) milliseconds apart.
If your input video is 30fps, you will need to drop frames during the encoding process to get to 19fps. MediaCodec does not drop frames for you -- it encodes everything you pass in.
I don't know why you'd be getting a broken section at the start of the video.
Camera2 OpenGL random glitches in video caused by Matrix.rotateM
If you aren't resetting transform to identity matrix then you are accumulating transforms on each frame.
Try:
Matrix.setIndentityM(transform, m);
before apply translation and rotation.
Besides, could be orientation:
if (AppSetting.getValue(activity, Config.ORIENTATION, "").equalsIgnoreCase("Portrait")) {
Matrix.rotateM(mTmpMatrix, 0, 270, 0, 0, 1);
Matrix.translateM(mTmpMatrix, 0, -1, 0, 0);
}
Related Topics
Android:Change Button Text and Background Color
Sqlite Query in Android to Count Rows
How to Send Multiple Images to Server Using Multipartentity from Android
Failed to Launch Emulator: Error: Emulator Didn't Connect Within 60 Seconds
Android Camera: Onactivityresult() Intent Is Null If It Had Extras
How to Delete from Firebase Realtime Database
Change Device Language via Adb
Updated Sdk Version, Getting Classnotfoundexception: Android.Support.V4.View.Viewpager
How to Change Action Bar Actions Dynamically
Chaining Requests in Retrofit + Rxjava
How to Open Navigation Drawer with No Actionbar, Open with Just a Button