- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在 Android 4.4 上使用屏幕录制。我找到了代码示例,但是不能写超过 3 分钟的视频。我该如何解决这个 Android 限制?在某些应用程序中,例如 Rec。此限制已被删除。
这是我使用的示例。
public class MainActivity extends Activity {
private static final int RUNNING_NOTIFICATION_ID = 73;
private static final int FINISHED_NOTIFICATION_ID = 1337;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new MainFragment())
.commit();
}
}
public static class MainFragment extends Fragment {
private Context mContext;
private EditText mWidthEditText;
private EditText mHeightEditText;
private EditText mBitrateEditText;
private EditText mTimeEditText;
private Button mRecordButton;
public MainFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
mContext = getActivity();
mRecordButton = (Button) rootView.findViewById(R.id.btn_record);
mRecordButton.setOnClickListener(RecordOnClickListener);
mWidthEditText = (EditText) rootView.findViewById(R.id.et_width);
mHeightEditText = (EditText) rootView.findViewById(R.id.et_height);
mBitrateEditText = (EditText) rootView.findViewById(R.id.et_bitrate);
mBitrateEditText.addTextChangedListener(BitrateTextWatcher);
mTimeEditText = (EditText) rootView.findViewById(R.id.et_time);
mTimeEditText.addTextChangedListener(TimeTextWatcher);
return rootView;
}
private TextWatcher BitrateTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
// Not used.
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
if (TextUtils.isEmpty(charSequence)) {
return;
}
int value = Integer.valueOf(charSequence.toString());
if (value > 50 || value == 0) {
mBitrateEditText.setError(mContext.getString(R.string.error_bitrate_edittext));
return;
}
mTimeEditText.setError(null);
}
@Override
public void afterTextChanged(Editable editable) {
// Not used.
}
};
private TextWatcher TimeTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
// Not used.
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
if (TextUtils.isEmpty(charSequence)) {
return;
}
int value = Integer.valueOf(charSequence.toString());
if (value > 180 || value == 0) {
mTimeEditText.setError(mContext.getString(R.string.error_time_editext));
return;
}
mTimeEditText.setError(null);
}
@Override
public void afterTextChanged(Editable editable) {
// Not used.
}
};
private View.OnClickListener RecordOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!TextUtils.isEmpty(mTimeEditText.getError()) || !TextUtils.isEmpty(mBitrateEditText.getError())) {
Toast.makeText(mContext, mContext.getString(R.string.toast_invalid_values), Toast.LENGTH_LONG).show();
return;
}
boolean widthSet = !TextUtils.isEmpty(mWidthEditText.getText());
boolean heightSet = !TextUtils.isEmpty(mHeightEditText.getText());
if ((!widthSet && heightSet) || (widthSet && !heightSet)) {
Toast.makeText(mContext, mContext.getString(R.string.error_invalid_wxh), Toast.LENGTH_LONG).show();
return;
}
boolean bitrateSet = !TextUtils.isEmpty(mBitrateEditText.getText());
boolean timeSet = !TextUtils.isEmpty(mTimeEditText.getText());
StringBuilder stringBuilder = new StringBuilder("/system/bin/screenrecord");
if (widthSet) {
stringBuilder.append(" --size ").append(mWidthEditText.getText()).append("x").append(mHeightEditText.getText());
}
if (bitrateSet) {
stringBuilder.append(" --bit-rate ").append(mBitrateEditText.getText());
}
if (timeSet) {
stringBuilder.append(" --time-limit ").append(mTimeEditText.getText());
}
// TODO User definable location.
stringBuilder.append(" ").append(Environment.getExternalStorageDirectory().toString()).append("/recording.mp4");
Log.d("TAG", "comamnd: " + stringBuilder.toString());
try {
new SuTask(stringBuilder.toString().getBytes("ASCII")).execute();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
};
private class SuTask extends AsyncTask<Boolean, Void, Boolean> {
private final byte[] mCommand;
public SuTask(byte[] command) {
super();
this.mCommand = command;
}
@Override
protected Boolean doInBackground(Boolean... booleans) {
try {
Process sh = Runtime.getRuntime().exec("su", null, null);
OutputStream outputStream = sh.getOutputStream();
outputStream.write(mCommand);
outputStream.flush();
outputStream.close();
final NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(RUNNING_NOTIFICATION_ID, createRunningNotification(mContext));
sh.waitFor();
return true;
} catch (InterruptedException e) {
e.printStackTrace();
Toast.makeText(mContext, mContext.getString(R.string.error_start_recording), Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(mContext, mContext.getString(R.string.error_start_recording), Toast.LENGTH_LONG).show();
}
return false;
}
@Override
protected void onPostExecute(Boolean bool) {
super.onPostExecute(bool);
if (bool) {
final NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(NOTIFICATION_SERVICE);
notificationManager.cancel(RUNNING_NOTIFICATION_ID);
File file = new File(Environment.getExternalStorageDirectory().toString() + "/recording.mp4");
notificationManager.notify(FINISHED_NOTIFICATION_ID, createFinishedNotification(mContext, file));
}
}
private Notification createRunningNotification(Context context) {
Notification.Builder mBuilder = new Notification.Builder(context)
.setSmallIcon(android.R.drawable.stat_notify_sdcard)
.setContentTitle(context.getResources().getString(R.string.app_name))
.setContentText("Recording Running")
.setTicker("Recording Running")
.setPriority(Integer.MAX_VALUE)
.setOngoing(true);
return mBuilder.build();
}
private Notification createFinishedNotification(Context context, File file) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "video/mp4");
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder mBuilder = new Notification.Builder(context)
.setSmallIcon(android.R.drawable.stat_notify_sdcard)
.setContentTitle(context.getResources().getString(R.string.app_name))
.setContentText("Recording Finished")
.setTicker("Recording Finished")
.setContentIntent(pendingIntent)
.setOngoing(false)
.setAutoCancel(true);
return mBuilder.build();
}
}
}
}
最佳答案
您不能绕过 3 分钟的限制。您可以组合多个 3 分钟的视频来制作更长的视频。
如果您愿意编写自己的屏幕录制功能,那么您将需要在线程中不断截取屏幕截图并将所有这些图像转换为视频。希望有一些库可供您使用。
另一种选择是从您的应用程序启动屏幕录制应用程序,但这需要在设备上也安装屏幕录制应用程序。
关于android - 如何以编程方式在 android 中录制超过 3 分钟的屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24103612/
我正在尝试解决 A/V 同步问题。视频将比音频延迟 1 秒。 (请看我下面的注释) 来自 Android 媒体框架部分, 我可以延迟音频时间戳让它与视频同步,我应该从哪里开始?是音频源吗? MPEG4
我正在使用带有 SignalR 的 MassTransit 请求和响应。该网站向创建文件的 Windows 服务发出请求。创建文件后,Windows 服务会将响应消息发送回网站。该网站将打开该文件并使
我正在尝试创建一个允许用户发出一些声音的应用程序,然后以回放方式使用它。 我想让我的应用程序播放用户将记录的.wav文件。 由于不断出现错误,我在弄清楚如何编写此代码时遇到了麻烦。 ====
有没有办法禁止网页上视频的屏幕共享? 例如,当您尝试录制或屏幕共享(例如通过 Skype)Netflix 视频时,它仅显示黑屏并且没有音频。 我的问题是,他们是如何实现的?我只能想到JavaScrip
我正在尝试使用 html5 .getUserMedia 录制视频,然后在不上传到服务器的情况下再次播放。我尝试了很多教程,我通过使用 canvas 绘制 webp 图像然后使用 Whammy.js 转
我想为我的网站的用户实现屏幕录制功能。这将适用于便士拍卖风格的网站,以便用户可以记录他们的出价,并在拍卖出现问题时提供证据。 这是在线录音机的演示。 http://www.screentoaster.
所以在我的应用程序中,我尝试使用屏幕截图“记录”屏幕。我必须将这些单独的帧作为图像,因为它们稍后会在服务器上进行修改和组合。增加这种复杂性的是,它是在使用 Cocos2D 的慢节奏游戏中。我目前截屏的
是否可以使用单个 ffmpeg 命令同时捕获(记录)RTSP 流和捕获场景变化事件?我几乎可以做我想做的事: ffmpeg -i 'rtsp://mystream' \ -map 0:v -map 0
我是 Objective-c 和 iPhone 编程新手,但我正在开发一个自学应用程序。我一直在尝试弄清楚如何在 iPhone 上录制声音。 Apple 提供了使用 AVAudioRecorder 从
我无法写任何东西来允许这样做,但我希望有人能指出我找到可以做到这一点的代码的正确方向。我擅长 HTML 和 CSS,对 JS 非常陌生。 我需要的是能够使用我的麦克风在单页网站上讲话,并将其流回。这样
想象一下您在浏览器中观看体育赛事直播。这意味着您收到了视频流,对吗?我需要记录这个流并保存到磁盘。问题是我不知道从哪里开始。我对编程并不陌生,但在视频直播方面有一些经验。我看到这个问题分为以下几个部分
我在开始录制时遇到文件未找到异常。此外,我无法在 JMeter 可安装文件夹中找到 RootCA 证书。 最佳答案 根据 TestRecording210 JMeter Wiki 页面当用户(您在其下
我有这个源代码可以在浏览器中录制音频。 Record.js 调用另一个脚本提供录音并将其保存到服务器。 index.html record.js //starts by click on butt
我允许用户按下按钮以通过 SoundPool 播放声音。是否可以录制 SoundPool 正在播放的任何内容,以便用户可以录制一系列声音? 最佳答案 实际上不可能捕捉到播放的声音。我也有同样的愿望,但
我正在尝试使用 xcrun simctl io booted recordVideo recording.mov 录制我的 iOS 11.4 模拟器的屏幕。这将创建一个具有该名称的文件,但不幸的是该文
好的,我将尝试尽可能清楚地说明我的问题,但我很困惑,所以如果我没有传达信息,请告诉我。 我正在尝试使用 getUserMedia 来使用网络摄像头,然后使用这个 http://www.w3.org/T
是否可以使用 html5 录制声音?我已经下载了最新的 canary 版本的 chrome 并使用以下代码: navigator.getUserMedia = navigator.webkitGetU
很多人都在问这个,似乎没有人有答案,所以我也没有。 某些应用程序如何提供记录android系统音频输出的功能?我发现的所有内容都是在 1432 个不同站点上的相同教程,您可以在其中记录 MIC 输入。
不小心撞到了qq而不是 @q ,我的 vim 现在正在记录到寄存器 q . 如果我输入 q再次,它将覆盖以前录制的宏。 有没有办法 取消录制以免覆盖之前的宏或 恢复之前的宏而不从头开始重新录制? 最佳
当我们接到电话时,我们会向来电者播放提示,内容类似于“我们可能会出于质量和培训目的记录通话”。 我们为响应来电而发送的 TWiML 如下所示。 http://domain.tld/may_r
我是一名优秀的程序员,十分优秀!