Extraer 5 segundos de un .avi
Publicado por Jose (1 intervención) el 23/09/2014 17:09:37
Buenas, tengo el siguiente programa, lo que hace es leer un fichero.avi, y recibe por handles.ini y handles.fin el tiempo de inicio y de fin de segmetno de videoq ue queremos extraer. Ese tiempo lo multiplciamos por los fotrograms por segudo y sacamos los frames que hay que sacar. Al intentar sacarlos todos con el comando vidFrames = read(handles.readerobj) dice que falta memoria, asi que los saco de 1 segundo en un segundo (30 fotrogramas en este caso) y genero tantos videos ed 1 segundo como me indique el tiepo de entrada....
El caso qeu el programa los genera, pero al reproducirlos seguidos es como si volviera hacia atrás unos cuantos fotogramas. Lo estoy haciendo con una GUI, por eso he puesto los comandos "assignin" para ver las variables y lo va haciendo bien... pero el resultado no esta correcto. no van solapados los videos.
¿Alguien ha hecho algo parecido? ¿O sabe donde estoy metiendo la pata?
Gracias por adelantado.
El caso qeu el programa los genera, pero al reproducirlos seguidos es como si volviera hacia atrás unos cuantos fotogramas. Lo estoy haciendo con una GUI, por eso he puesto los comandos "assignin" para ver las variables y lo va haciendo bien... pero el resultado no esta correcto. no van solapados los videos.
¿Alguien ha hecho algo parecido? ¿O sabe donde estoy metiendo la pata?
Gracias por adelantado.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
handles.readerobj= VideoReader(handles.filename_video, 'tag', 'myreader1');
%%Falta de memoria seleccionamos frames por bloques
% Preguntamos los tiempos de inicio y fin
handles.numFrames = get(handles.readerobj, 'NumberOfFrames');
handles.frameRate = fix(get(handles.readerobj, 'FrameRate'));
assignin('base','handles_frameRate',handles.frameRate);
ciclos=handles.fin-handles.inicio;
assignin('base','handles_ciclos',ciclos);
% resto=rem(frame_fin-frame_ini)/30);
% if (resto=~0) %Si hay resto hacemos un ciclo mas.
% ciclos=ciclos+1;
% end
%Calcuamos los frames de inicio y fin
handles.frame_ini = floor(handles.inicio*handles.frameRate);
handles.frame_fin= floor(handles.fin*handles.frameRate);
assignin('base','handles_frame_ini',handles.frame_ini);
assignin('base','handles_frame_fin',handles.frame_fin);
%Generamos la figura
hf = handles.video;
handles.position=get(handles.video,'Position');
for c=1: ciclos
video_save=strcat('video',num2str(c));
%Abrimos fichero para guardar como avi
vidObj = VideoWriter(video_save);
open(vidObj)
%Cargamos los frames en un objeto
assignin('base','handles_readerobj',handles.readerobj);
lastFrame = read(handles.readerobj, inf);
handles.frameRate = fix(get(handles.readerobj, 'FrameRate'));
assignin('base','handles_frameRate',handles.frameRate);
vidFrames = read(handles.readerobj,[handles.frame_ini handles.frame_ini+handles.frameRate-1]); %Seleccionamos 'frameRate' frames
assignin('base','vidFrames',vidFrames);
% Extraemos los frames del objeto
for i=1:handles.frameRate %Seleccionamos los siguientes 30 frames
mov(i).cdata = vidFrames(:,:,:,i);
mov(i).colormap = [];
end
assignin('base','mov',mov);
% Resize figure based on the video's width and height
set(hf, 'position', handles.position);
axis off
% Playback movie once at the video's frame rate
movie(handles.video, mov, 1, handles.readerobj.FrameRate);
assignin('base','handles_readerobj_FrameRate',handles.readerobj.FrameRate);
%handles.frame_ini = handles.frame_ini+handles.frameRate; %Vamos al siguiente bloque
handles.frame_ini = handles.frame_ini+handles.frameRate; %Vamos al siguiente bloque
assignin('base','handles_frame_ini',handles.frame_ini);
handles.frame_ini
%Guardamos el video
writeVideo(vidObj,mov);
%Cerramos el fichero
close(vidObj);
clear mov; %Borramos el video anterior
end
Valora esta pregunta


0