添加屏幕录制分辨率自适应选项

master
linxiao 2018-08-10 13:46:40 +08:00
parent eb3de04d67
commit 7f83800296
4 changed files with 24 additions and 48 deletions

View File

@ -38,6 +38,7 @@ class RecordConfig():
record_section_name = 'record' record_section_name = 'record'
conf.add_section(record_section_name) conf.add_section(record_section_name)
conf.set(record_section_name,'resolution','1920x1080') conf.set(record_section_name,'resolution','1920x1080')
conf.set(record_section_name,'adaptive_screen_resolution','1')
conf.set(record_section_name,'vcodec','libx264') conf.set(record_section_name,'vcodec','libx264')
conf.set(record_section_name,'frame_rate','7.0') conf.set(record_section_name,'frame_rate','7.0')
conf.set(record_section_name,'file_dir','.') conf.set(record_section_name,'file_dir','.')

View File

@ -72,6 +72,8 @@ class RecordVideo():
self.video_codec=rc.config.get('record','vcodec') self.video_codec=rc.config.get('record','vcodec')
#分辨率 #分辨率
self.resolution=rc.config.get('record','resolution') self.resolution=rc.config.get('record','resolution')
#是否自适应屏幕录制分辨率
self.adaptive_screen_resolution = rc.config.getboolean('record', 'adaptive_screen_resolution')
#帧率 #帧率
self.brate=rc.config.getfloat('record','frame_rate') self.brate=rc.config.getfloat('record','frame_rate')
#文件目录 #文件目录
@ -213,15 +215,17 @@ class RecordVideo():
# print(record_cmd) # print(record_cmd)
self.record(record_cmd, self.start_ffmpeg) self.record(record_cmd, self.start_ffmpeg)
def record_screen(self): def record_screen(self, resolution='1024x768'):
if self.screen_name and self.system_voice_device_name: if self.screen_name and self.system_voice_device_name:
self.record_type=RecordType.Screen self.record_type=RecordType.Screen
if self.adaptive_screen_resolution is not True:
resolution = self.resolution
record_cmd='ffmpeg -f dshow -i video="{}":audio="{}" -acodec libmp3lame -vcodec {} -preset:v ultrafast -tune:v zerolatency -s {} -r {} -threads {} -y {}'.format( record_cmd='ffmpeg -f dshow -i video="{}":audio="{}" -acodec libmp3lame -vcodec {} -preset:v ultrafast -tune:v zerolatency -s {} -r {} -threads {} -y {}'.format(
self.deal_with_device_name(self.screen_name), self.deal_with_device_name(self.screen_name),
self.deal_with_device_name(self.system_voice_device_name), self.deal_with_device_name(self.system_voice_device_name),
self.video_codec, self.video_codec,
# '1024x768', #屏幕录制分辨率固定 # '1024x768', #屏幕录制分辨率固定
self.resolution, resolution,
self.brate, self.brate,
self.threads, self.threads,
self.get_file_name() self.get_file_name()

View File

@ -19,12 +19,13 @@ from RecordHelp import *
class RecordWindow(QtWidgets.QWidget): class RecordWindow(QtWidgets.QWidget):
def __init__(self, parent = None): def __init__(self, parent = None, screen_resolution=None):
super(RecordWindow,self).__init__(parent) super(RecordWindow,self).__init__(parent)
self.setupUi() self.setupUi()
self.load_modules() self.load_modules()
#更新设置 #更新设置
self.need_update_config = False self.need_update_config = False
self.screen_resolution = screen_resolution
# self.need_hide = True # self.need_hide = True
#初始化状态 #初始化状态
print('初始化状态...') print('初始化状态...')
@ -39,7 +40,6 @@ class RecordWindow(QtWidgets.QWidget):
self.rti = RecordTrayIcon(self) self.rti = RecordTrayIcon(self)
self.rti.update_state(self.recording, self.record_type) self.rti.update_state(self.recording, self.record_type)
self.sc = Shortcut() self.sc = Shortcut()
self.update_setting(True) self.update_setting(True)
@ -320,7 +320,7 @@ class RecordWindow(QtWidgets.QWidget):
self.rv.record_camera() self.rv.record_camera()
elif rtype == RecordType.Screen: elif rtype == RecordType.Screen:
print('开始录制屏幕...') print('开始录制屏幕...')
self.rv.record_screen() self.rv.record_screen(resolution=self.screen_resolution)
self.start_timer() self.start_timer()
self.update_state() self.update_state()
@ -491,7 +491,9 @@ if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv) app = QtWidgets.QApplication(sys.argv)
#当这个属性为True应用程序会在最后一个可见窗口关闭时退出。 #当这个属性为True应用程序会在最后一个可见窗口关闭时退出。
app.setQuitOnLastWindowClosed(False) app.setQuitOnLastWindowClosed(False)
rw = RecordWindow() screen = app.desktop().screenGeometry()
resolution = '{}x{}'.format(screen.width(), screen.height())
rw = RecordWindow(screen_resolution=resolution)
rw.monitor_shortcut() rw.monitor_shortcut()
rw.rti.show() rw.rti.show()
rw.show() rw.show()

View File

@ -187,6 +187,10 @@ class SettingWindow(QDialog):
self.threads_spinBox.setSizePolicy(sizePolicy) self.threads_spinBox.setSizePolicy(sizePolicy)
self.threads_spinBox.setObjectName("record.threads") self.threads_spinBox.setObjectName("record.threads")
self.gridLayout.addWidget(self.threads_spinBox, 5, 1, 1, 1) self.gridLayout.addWidget(self.threads_spinBox, 5, 1, 1, 1)
self.ckb_adaptive_screen_resolution = QtWidgets.QCheckBox(self.gridLayoutWidget)
self.ckb_adaptive_screen_resolution.setObjectName("ckb_adaptive_screen_resolution")
self.ckb_adaptive_screen_resolution.setStyleSheet("padding-left:10")
self.gridLayout.addWidget(self.ckb_adaptive_screen_resolution, 0, 2, 1, 1)
self.tabWidget.addTab(self.tab_record, "") self.tabWidget.addTab(self.tab_record, "")
self.save_button = QtWidgets.QPushButton(self) self.save_button = QtWidgets.QPushButton(self)
@ -218,6 +222,7 @@ class SettingWindow(QDialog):
self.label_12.setText(_translate("Form", "分辨率:")) self.label_12.setText(_translate("Form", "分辨率:"))
self.btn_file_dir.setText(_translate("Form", "选择文件目录")) self.btn_file_dir.setText(_translate("Form", "选择文件目录"))
self.threads_label.setText(_translate("Form", "CPU线程")) self.threads_label.setText(_translate("Form", "CPU线程"))
self.ckb_adaptive_screen_resolution.setText(_translate("Form", "屏幕录制自适应"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_record), _translate("Form", "录制参数")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_record), _translate("Form", "录制参数"))
self.save_button.setText(_translate("Form", "保存")) self.save_button.setText(_translate("Form", "保存"))
self.cancel_button.setText(_translate("Form", "取消")) self.cancel_button.setText(_translate("Form", "取消"))
@ -273,12 +278,13 @@ class SettingWindow(QDialog):
record_file_dir = self.rc.config.get('record','file_dir') record_file_dir = self.rc.config.get('record','file_dir')
record_file_dir = os.path.abspath(record_file_dir) record_file_dir = os.path.abspath(record_file_dir)
record_threads = int(self.rc.config.get('record','threads')) record_threads = int(self.rc.config.get('record','threads'))
record_adaptive_resolution = self.rc.config.getboolean('record', 'adaptive_screen_resolution')
self.cb_resolution.setCurrentIndex(self.cb_resolution.findData(record_resolution)) self.cb_resolution.setCurrentIndex(self.cb_resolution.findData(record_resolution))
self.ckb_adaptive_screen_resolution.setChecked(record_adaptive_resolution)
self.cb_vcodec.setCurrentIndex(self.cb_vcodec.findData(record_vcodec)) self.cb_vcodec.setCurrentIndex(self.cb_vcodec.findData(record_vcodec))
self.dsb_frame_rate.setValue(record_frame_rate) self.dsb_frame_rate.setValue(record_frame_rate)
self.le_file_path.setText(record_file_dir) self.le_file_path.setText(record_file_dir)
self.threads_spinBox.setValue(record_threads) self.threads_spinBox.setValue(record_threads)
def load(self): def load(self):
@ -341,7 +347,7 @@ class SettingWindow(QDialog):
self.dsb_frame_rate.valueChanged.connect(self.stateChangedEvent) self.dsb_frame_rate.valueChanged.connect(self.stateChangedEvent)
self.le_file_path.textChanged.connect(self.stateChangedEvent) self.le_file_path.textChanged.connect(self.stateChangedEvent)
self.threads_spinBox.valueChanged.connect(self.stateChangedEvent) self.threads_spinBox.valueChanged.connect(self.stateChangedEvent)
self.ckb_adaptive_screen_resolution.stateChanged.connect(self.stateChangedEvent)
# self.le_start_record_camera_shortcut.keyPressEvent = self.record_keypress # self.le_start_record_camera_shortcut.keyPressEvent = self.record_keypress
# print(dir(self.le_start_record_camera_shortcut.keyPressEvent)) # print(dir(self.le_start_record_camera_shortcut.keyPressEvent))
@ -410,6 +416,7 @@ class SettingWindow(QDialog):
#录制 #录制
resolution = self.cb_resolution.currentData() resolution = self.cb_resolution.currentData()
adaptive_screen_resolution = str(self.ckb_adaptive_screen_resolution.isChecked())
video_codec = self.cb_vcodec.currentData() video_codec = self.cb_vcodec.currentData()
frame_rate = self.dsb_frame_rate.value() frame_rate = self.dsb_frame_rate.value()
file_dir = self.le_file_path.text() file_dir = self.le_file_path.text()
@ -432,6 +439,7 @@ class SettingWindow(QDialog):
record_section_name = 'record' record_section_name = 'record'
conf.set(record_section_name,'resolution', resolution) conf.set(record_section_name,'resolution', resolution)
conf.set(record_section_name,'adaptive_screen_resolution', adaptive_screen_resolution)
conf.set(record_section_name,'vcodec', video_codec) conf.set(record_section_name,'vcodec', video_codec)
conf.set(record_section_name,'frame_rate', str(frame_rate)) conf.set(record_section_name,'frame_rate', str(frame_rate))
conf.set(record_section_name,'file_dir', file_dir) conf.set(record_section_name,'file_dir', file_dir)
@ -475,47 +483,8 @@ class SettingWindow(QDialog):
pass pass
print('not found this section or name.') print('not found this section or name.')
# def indexChangedEvent(self, index, obj):
# print('in data changed event.')
# print(index)
# print('event obj:%s' % type(obj))
# print('obj name:%s' % obj.objectName())
# value = obj.currentData()
# obj_name = obj.objectName()
# self.setting(obj_name, value)
def stateChangedEvent(self, new_value): def stateChangedEvent(self, new_value):
print('changed value is :%s' % new_value) print('changed value is :%s' % new_value)
self.changed = True self.changed = True
self.update_state() self.update_state()
# def textChangedEvent(self, obj):
# print('type of self:%s' % type(self))
# print('type of text:%s' % type(text))
# print('type of obj:%s' % type(obj))
# value = obj.text()
# obj_name = obj.objectName()
# self.setting(obj_name, value)
# def valueChangedEvent(self, new_value):
# print('changed value is :%s.' % new_value)
# self.changed = True
# self.update_state()
# obj = self.dsb_frame_rate
# value = obj.value()
# print('value:%1.f' % value)
# obj_name = obj.objectName()
# self.setting(obj_name, str(value))
# def valueChangedEvent_spinBox(self):
# print('in value changed event.')
# obj = self.threads_spinBox
# value = obj.value()
# print('value:%1.f' % value)
# obj_name = obj.objectName()
# self.setting(obj_name, str(value))