Laman

Saturday, November 16, 2013

Developer's notes IV. Presets for screen recording in Android 4.4 KitKat

One of the most useful Android 4.4 features for me is screen recording. This allows us to record videos of live wallpapers and upload them to YouTube. Before this we had to record videos either with camcorder (looks quite blurry) or from emulator (low-res and a bit laggy). So right after updating my Nexus 7 (1st gen) and Nexus 10 to Android KitKat I've decided to try this feature out.



Basically, everybody making app reviews will find this feature extremely useful

To record videos in Android 4.4 you should use adb shell screenrecord command. You can read Android documentation on this here: http://developer.android.com/tools/help/adb.html#screenrecord.  After reading docs, first thing you would like to do is to launch utility with --help option:
c:\Program Files (x86)\Android\android-sdk\platform-tools>adb shell screenrecord --help
Usage: screenrecord [options] <filename>

Records the device's display to a .mp4 file.

Options:
--size WIDTHxHEIGHT
    Set the video size, e.g. "1280x720".  Default is the device's main
    display resolution (if supported), 1280x720 if not.  For best results,
    use a size supported by the AVC encoder.
--bit-rate RATE
    Set the video bit rate, in megabits per second.  Default 4Mbps.
--time-limit TIME
    Set the maximum recording time, in seconds.  Default / maximum is 180.
--rotate
    Rotate the output 90 degrees.
--verbose
    Display interesting information on stdout.
--help
    Show this message.

Recording continues until Ctrl-C is hit or the time limit is reached.

Recording on default settings will result in skipped frames and quality will be worse than you'd expect. On N7 you will get laggy video and on N10 you will get ugly compression artifacts - default 4Mbps bit rate is simply not enough for its enormous 2560x1600 resolution. So I've picked presets which I believe are optimal for my needs and don't cause UI lag when recording. When playing around with options, please note that you need to specify bit rate in bps, not Mbps, but yes, it reads "in megabits per second" :)

Here are command line parameters for screen recording which I believe are the most optimal:

N10:
adb shell screenrecord /sdcard/video.mp4 --bit-rate 8000000 --size 1280x720
N7 1st gen:
adb shell screenrecord /sdcard/video.mp4 --size 960x540 --bit-rate 5000000
I don't use --time-limit option but just hit Ctrl+C after I finished recording.

Because adb shell command simply executes any shell commands on device you can call screenrecord command directly on your device in Android Terminal Emulator app. But you need to run it with root permissions to be able to actually record videos so if device is not rooted you have to use adb shell from your PC. Example:
screenrecord /sdcard/video.mp4 --bit-rate 8000000 --size 1280x720

Also note that if you rotate device when recording you will get cropped video - you will have to record landscape and portrait videos separately.

So Nexus 10 is capable of recording quite good 720p videos with little to no frameskip (it is barely noticeable when recording usual apps like browser or GMail but becomes a little bit laggy recording full-screen animations like app drawer transitions). To my liking, videos recorded from Nexus 7 have more even framerate but on Nexus10 you can achieve more sharp image because of higher resolution.

Here is a sample video recorded from Nexus 7. Android doesn't record audio - I've added some free audio track in Youtube Video Manager.



Feel free to post your presets for your devices in comments - may be you will achieve better quality than me :)

No comments:

Post a Comment

Related Posts Plugin for WordPress, Blogger...