从相机在Android录制视频的MP4 [英] Record video from camera on Android to mp4
问题描述
似乎有 TVideoCaptureDevice
的FireMonkey(德尔福XE6),但在正式文件,捕捉过程结束就行:
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.
下面code在
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;
结束;
这code是一个(接近)完整的问题的答案。该设备专用的视频录像机用户界面推出了与之交互的用户。没有编程控制比记录保存到文件的名称等。作为德尔福开发谁是Android的API不堪重负,我很感激这个解决方案。
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屋!