seawolf2357 commited on
Commit
0e418ae
·
verified ·
1 Parent(s): df2ef41

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -25
app.py CHANGED
@@ -147,35 +147,65 @@ def interpolate_frames(video_path, target_fps=30):
147
  print("Not enough frames for interpolation.")
148
  return video_path
149
 
150
- # Calculate interpolation factor
151
- interpolation_factor = int(target_fps / original_fps)
152
- interpolated_frames = []
153
 
154
- print(f"Interpolating with factor: {interpolation_factor}")
 
 
 
 
 
 
155
 
156
  # Perform frame interpolation
157
- for i in range(len(frames) - 1):
158
- interpolated_frames.append(frames[i])
159
-
160
- # Generate intermediate frames
161
- for j in range(1, interpolation_factor):
162
- alpha = j / interpolation_factor
163
- # Use weighted average for simple interpolation
164
- interpolated_frame = cv2.addWeighted(
165
- frames[i], 1 - alpha,
166
- frames[i + 1], alpha,
167
- 0
168
- )
169
- interpolated_frames.append(interpolated_frame)
170
 
171
- # Add the last frame
172
- interpolated_frames.append(frames[-1])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
 
174
  # Save the interpolated video
175
  output_path = video_path.replace('.mp4', '_interpolated.mp4')
176
- fourcc = cv2.VideoWriter_fourcc(*'mp4v')
 
 
177
  out = cv2.VideoWriter(output_path, fourcc, target_fps, (width, height))
178
 
 
 
 
 
 
179
  for frame in interpolated_frames:
180
  out.write(frame)
181
  out.release()
@@ -185,6 +215,8 @@ def interpolate_frames(video_path, target_fps=30):
185
 
186
  except Exception as e:
187
  print(f"Error during frame interpolation: {e}")
 
 
188
  return video_path # Return original if interpolation fails
189
 
190
  # --- Initialization ---
@@ -395,7 +427,7 @@ with gr.Blocks(theme=gr.themes.Soft(), css=".gradio-container {max-width: 960px
395
  minimum=0.5,
396
  maximum=5.0,
397
  step=0.1,
398
- value=0.5,
399
  info="Lower values produce smoother but less controlled motion"
400
  )
401
 
@@ -412,10 +444,10 @@ with gr.Blocks(theme=gr.themes.Soft(), css=".gradio-container {max-width: 960px
412
  fps_slider = gr.Slider(
413
  label="Target FPS",
414
  minimum=24,
415
- maximum=60,
416
- step=6,
417
- value=60,
418
- info="Higher FPS for smoother motion (uses frame interpolation)"
419
  )
420
 
421
  submit_button = gr.Button("🎥 Generate Video", variant="primary", size="lg")
 
147
  print("Not enough frames for interpolation.")
148
  return video_path
149
 
150
+ # Calculate interpolation factor (can be fractional)
151
+ interpolation_factor = target_fps / original_fps
 
152
 
153
+ # For fractional factors, we need different approach
154
+ if interpolation_factor <= 1:
155
+ print("Interpolation factor too low. Skipping.")
156
+ return video_path
157
+
158
+ print(f"Interpolating with factor: {interpolation_factor:.2f}")
159
+ print(f"Total frames to process: {len(frames)}")
160
 
161
  # Perform frame interpolation
162
+ interpolated_frames = []
 
 
 
 
 
 
 
 
 
 
 
 
163
 
164
+ if interpolation_factor == int(interpolation_factor):
165
+ # Integer factor - simple interpolation
166
+ factor = int(interpolation_factor)
167
+ for i in range(len(frames) - 1):
168
+ interpolated_frames.append(frames[i])
169
+ # Generate intermediate frames
170
+ for j in range(1, factor):
171
+ alpha = j / factor
172
+ interpolated_frame = cv2.addWeighted(
173
+ frames[i], 1 - alpha,
174
+ frames[i + 1], alpha,
175
+ 0
176
+ )
177
+ interpolated_frames.append(interpolated_frame)
178
+ interpolated_frames.append(frames[-1])
179
+ else:
180
+ # Fractional factor - use different approach
181
+ # For 25 -> 60 fps, we need to add selective frames
182
+ for i in range(len(frames) - 1):
183
+ interpolated_frames.append(frames[i])
184
+ # Add intermediate frame for smoother motion
185
+ if i % 2 == 0: # Add extra frame every other original frame
186
+ alpha = 0.4 # Blend ratio
187
+ interpolated_frame = cv2.addWeighted(
188
+ frames[i], 1 - alpha,
189
+ frames[i + 1], alpha,
190
+ 0
191
+ )
192
+ interpolated_frames.append(interpolated_frame)
193
+ interpolated_frames.append(frames[-1])
194
+
195
+ print(f"Total interpolated frames: {len(interpolated_frames)}")
196
 
197
  # Save the interpolated video
198
  output_path = video_path.replace('.mp4', '_interpolated.mp4')
199
+
200
+ # Use H.264 codec for better compatibility
201
+ fourcc = cv2.VideoWriter_fourcc(*'H264')
202
  out = cv2.VideoWriter(output_path, fourcc, target_fps, (width, height))
203
 
204
+ if not out.isOpened():
205
+ # Fallback to mp4v if H264 not available
206
+ fourcc = cv2.VideoWriter_fourcc(*'mp4v')
207
+ out = cv2.VideoWriter(output_path, fourcc, target_fps, (width, height))
208
+
209
  for frame in interpolated_frames:
210
  out.write(frame)
211
  out.release()
 
215
 
216
  except Exception as e:
217
  print(f"Error during frame interpolation: {e}")
218
+ import traceback
219
+ traceback.print_exc()
220
  return video_path # Return original if interpolation fails
221
 
222
  # --- Initialization ---
 
427
  minimum=0.5,
428
  maximum=5.0,
429
  step=0.1,
430
+ value=1.0,
431
  info="Lower values produce smoother but less controlled motion"
432
  )
433
 
 
444
  fps_slider = gr.Slider(
445
  label="Target FPS",
446
  minimum=24,
447
+ maximum=50,
448
+ step=1,
449
+ value=30,
450
+ info="Higher FPS for smoother motion. 30 FPS recommended, 50 FPS maximum"
451
  )
452
 
453
  submit_button = gr.Button("🎥 Generate Video", variant="primary", size="lg")