1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
10 from devil
.android
import device_signal
11 from devil
.utils
import cmd_helper
14 class VideoRecorder(object):
15 """Records a screen capture video from an Android Device (KitKat or newer).
18 device: DeviceUtils instance.
19 host_file: Path to the video file to store on the host.
20 megabits_per_second: Video bitrate in megabits per second. Allowed range
22 size: Video frame size tuple (width, height) or None to use the device
24 rotate: If True, the video will be rotated 90 degrees.
26 def __init__(self
, device
, megabits_per_second
=4, size
=None,
30 '%s/screen-recording.mp4' % device
.GetExternalStoragePath())
32 self
._recorder
_stdout
= None
33 self
._is
_started
= False
37 self
._args
+= ['-s', str(self
._device
)]
38 self
._args
+= ['shell', 'screenrecord', '--verbose']
39 self
._args
+= ['--bit-rate', str(megabits_per_second
* 1000 * 1000)]
41 self
._args
+= ['--size', '%dx%d' % size
]
43 self
._args
+= ['--rotate']
44 self
._args
+= [self
._device
_file
]
47 """Start recording video."""
48 self
._recorder
_stdout
= tempfile
.mkstemp()[1]
49 self
._recorder
= cmd_helper
.Popen(
50 self
._args
, stdout
=open(self
._recorder
_stdout
, 'w'))
51 if not self
._device
.GetPids('screenrecord'):
52 raise RuntimeError('Recording failed. Is your device running Android '
56 if not self
._is
_started
:
57 for line
in open(self
._recorder
_stdout
):
58 self
._is
_started
= line
.startswith('Content area is ')
61 return self
._is
_started
64 """Stop recording video."""
65 os
.remove(self
._recorder
_stdout
)
66 self
._is
_started
= False
67 if not self
._recorder
:
69 if not self
._device
.KillAll('screenrecord', signum
=device_signal
.SIGINT
,
71 logging
.warning('Nothing to kill: screenrecord was not running')
74 def Pull(self
, host_file
=None):
75 """Pull resulting video file from the device.
78 host_file: Path to the video file to store on the host.
80 Output video file name on the host.
82 # TODO(jbudorick): Merge filename generation with the logic for doing so in
86 or 'screen-recording-%s.mp4' % time
.strftime('%Y%m%dT%H%M%S',
88 host_file_name
= os
.path
.abspath(host_file_name
)
89 self
._device
.PullFile(self
._device
_file
, host_file_name
)
90 self
._device
.RunShellCommand('rm -f "%s"' % self
._device
_file
)