从 Android 上的相机录制视频到 mp4 [英] Record video from camera on Android to mp4
问题描述
FireMonkey (Delphi XE6) 中似乎有 TVideoCaptureDevice
,但在官方文档中,捕获过程以行结束:
There seems to be TVideoCaptureDevice
in FireMonkey (Delphi XE6), but on official documentation, capturing process ends up on lines:
if(VideoCamera){
//do something
}
如何在飞行中将视频录制为 mp4?尝试在谷歌上查找,但没有找到任何答案...
What do I do to record video to mp4 on flight? Tried looking on google, but didn't find any answer...
推荐答案
请参阅以下 docwiki 以获取答案(排序).
See the following docwiki for an answer (sort-of).
当然,这里的捕获"一词是指获取视频输入并将其放在显示器上.录制"意味着将帧连接在一起以制作电影文件.
Of course the word "capturing" here means, getting the video input and putting it on the display. "Recording" means joining the frames together to make a movie file.
以下代码由
flashavconverter 并在他们的批准下发布:
flashavconverter and is posted here with their approval:
uses
Androidapi.JNI.GraphicsContentViewText;
const
RECORD_VIDEO = 9;
implementation
uses
System.IOUtils,
Androidapi.JNI.Provider,
Androidapi.JNI.App,
Androidapi.JNI.Net,
Androidapi.JNIBridge,
Androidapi.Helpers,
Androidapi.JNI.JavaTypes,
Androidapi.JNI.Os;
{$R *.fmx}
procedure TFormMain.btnRecordClick(Sender: TObject);
var
VideoIntent: JIntent;
videoUri: Jnet_Uri;
AFile: JFile;
FileName: TFileName;
begin
FMessageSubscriptionID :=
TMessageManager.DefaultManager.SubscribeToMessage(
TMessageResultNotification, HandleActivityMessage);
VideoIntent :=
TJIntent.JavaClass.init(
TJMediaStore.JavaClass.ACTION_VIDEO_CAPTURE
);
if (
VideoIntent.resolveActivity(
SharedActivityContext.getPackageManager()
) <> nil) then
begin
FileName := TPath.Combined(
TPath.GetSharedDocumentsPath, 'recording.mp4')
AFile:=TJFile.JavaClass.init(
StringToJString(FileName));
videoUri:=TJnet_Uri.JavaClass.fromFile(AFile);
VideoIntent.putExtra(
TJMediaStore.JavaClass.EXTRA_OUTPUT,
TJParcelable.Wrap((videoUri as ILocalObject).GetObjectID));
SharedActivity.startActivityForResult(VideoIntent, RECORD_VIDEO);
end;
end;
procedure TFormMain.HandleActivityMessage(const Sender: TObject;
const M: TMessage);
begin
if M is TMessageResultNotification then
OnActivityResult(
TMessageResultNotification(M).RequestCode,
TMessageResultNotification(M).ResultCode,
TMessageResultNotification(M).Value);
end;
function TFormMain.OnActivityResult(RequestCode, ResultCode: Integer;
Data: JIntent): Boolean;
begin
Result := False;
TMessageManager.DefaultManager.Unsubscribe(
TMessageResultNotification, FMessageSubscriptionID);
FMessageSubscriptionID := 0;
if RequestCode = RECORD_VIDEO then
begin
if ResultCode = TJActivity.JavaClass.RESULT_OK then
begin
TThread.Queue(nil, procedure
begin
lable1.Text:='recording completed';
Invalidate;
end);
end;
end;
结束;
此代码是该问题的(接近)完整答案.启动设备特定的录像机 UI 以供用户交互.除了保存记录的文件的名称之外,没有任何程序控制.作为一个被 Android API 压得喘不过气来的 Delphi 开发者,我很感激这个解决方案.
This code is a (near) complete answer to the question. The device-specific video recorder UI is launched for the user to interact with. There is no programmatic control other than the name of the file that the recording is saved to. As a Delphi developer who is overwhelmed by the Android API, I am grateful for this solution.
这篇关于从 Android 上的相机录制视频到 mp4的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!