Matlab - Extraer 5 segundos de un .avi

 
Vista:

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.


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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder