Spaces:
Running
on
Zero
Running
on
Zero
Revert "feat: Implement GPU optimization for FFmpeg commands and enhance filter conversion"
Browse filesThis reverts commit 5c95722cc4d32e8c5d6a47b1e0ab79840f542387.
app.py
CHANGED
@@ -139,8 +139,6 @@ Key requirements:
|
|
139 |
- If the user asks for waveform visualization make sure to set the mode to `line` with and the use the full width of the video. Also concatenate the audio into a single channel.
|
140 |
- For image sequences: Use -framerate and pattern matching (like 'img%d.jpg') when possible, falling back to individual image processing with -loop 1 and appropriate filters only when necessary.
|
141 |
- When showing file operations or commands, always use explicit paths and filenames without wildcards - avoid using asterisk (*) or glob patterns. Instead, use specific numbered sequences (like %d), explicit file lists, or show the full filename.
|
142 |
-
- GPU optimization will be handled automatically - use standard CPU filter names (scale, overlay, etc.) and they will be converted to GPU equivalents when possible
|
143 |
-
- Prefer using standard codecs like libx264 or libx265 - GPU acceleration for decoding will be added automatically
|
144 |
|
145 |
Remember: Simpler is better. Only use advanced ffmpeg features if absolutely necessary for the requested output.
|
146 |
""",
|
@@ -231,80 +229,12 @@ YOUR RESPONSE:
|
|
231 |
@spaces.GPU(duration=120)
|
232 |
def execute_ffmpeg_command(args, temp_dir, output_file_path):
|
233 |
"""Execute FFmpeg command with GPU acceleration"""
|
234 |
-
|
235 |
-
optimized_args = optimize_ffmpeg_for_gpu(args)
|
236 |
-
final_command = optimized_args + ["-y", output_file_path]
|
237 |
print(f"\n=== EXECUTING FFMPEG COMMAND ===\nffmpeg {' '.join(final_command[1:])}\n")
|
238 |
subprocess.run(final_command, cwd=temp_dir)
|
239 |
return output_file_path
|
240 |
|
241 |
|
242 |
-
def optimize_ffmpeg_for_gpu(args):
|
243 |
-
"""Optimize FFmpeg command for GPU acceleration without NVENC"""
|
244 |
-
optimized = ["ffmpeg"]
|
245 |
-
|
246 |
-
# Add hardware acceleration for decoding
|
247 |
-
if "-hwaccel" not in args:
|
248 |
-
optimized.extend(["-hwaccel", "cuda"])
|
249 |
-
|
250 |
-
# Add CUDA device selection (use GPU 0 by default)
|
251 |
-
if "-hwaccel_device" not in args:
|
252 |
-
optimized.extend(["-hwaccel_device", "0"])
|
253 |
-
|
254 |
-
# Add pixel format for CUDA processing
|
255 |
-
cuda_filters_needed = any("-vf" in str(arg) or "-filter_complex" in str(arg) for arg in args)
|
256 |
-
|
257 |
-
# Add the rest of the original arguments (skip the first 'ffmpeg')
|
258 |
-
for i, arg in enumerate(args[1:], 1):
|
259 |
-
if arg == "-c:v" and i < len(args) - 1:
|
260 |
-
# Use GPU-accelerated codecs when available
|
261 |
-
next_arg = args[i + 1]
|
262 |
-
if next_arg == "libx264":
|
263 |
-
optimized.extend(["-c:v", "h264_cuvid" if cuda_filters_needed else "libx264"])
|
264 |
-
continue
|
265 |
-
elif next_arg == "libx265":
|
266 |
-
optimized.extend(["-c:v", "hevc_cuvid" if cuda_filters_needed else "libx265"])
|
267 |
-
continue
|
268 |
-
|
269 |
-
# Convert CPU filters to GPU equivalents where possible
|
270 |
-
if arg == "-vf" and i < len(args) - 1:
|
271 |
-
gpu_filter = convert_filters_to_gpu(args[i + 1])
|
272 |
-
optimized.extend(["-vf", gpu_filter])
|
273 |
-
continue
|
274 |
-
elif arg == "-filter_complex" and i < len(args) - 1:
|
275 |
-
gpu_filter = convert_filters_to_gpu(args[i + 1])
|
276 |
-
optimized.extend(["-filter_complex", gpu_filter])
|
277 |
-
continue
|
278 |
-
|
279 |
-
optimized.append(arg)
|
280 |
-
|
281 |
-
return optimized
|
282 |
-
|
283 |
-
|
284 |
-
def convert_filters_to_gpu(filter_string):
|
285 |
-
"""Convert CPU filters to GPU-accelerated equivalents"""
|
286 |
-
# Common filter conversions for CUDA
|
287 |
-
gpu_filters = {
|
288 |
-
'scale=': 'scale_cuda=',
|
289 |
-
'overlay=': 'overlay_cuda=',
|
290 |
-
'transpose=': 'transpose_cuda=',
|
291 |
-
'crop=': 'crop_cuda=',
|
292 |
-
'pad=': 'pad_cuda=',
|
293 |
-
'format=yuv420p': 'format=nv12', # Better GPU format
|
294 |
-
}
|
295 |
-
|
296 |
-
gpu_filter = filter_string
|
297 |
-
for cpu_filter, gpu_equivalent in gpu_filters.items():
|
298 |
-
if cpu_filter in gpu_filter:
|
299 |
-
gpu_filter = gpu_filter.replace(cpu_filter, gpu_equivalent)
|
300 |
-
|
301 |
-
# Add format conversion for GPU processing
|
302 |
-
if 'cuda' in gpu_filter and 'format=' not in gpu_filter:
|
303 |
-
gpu_filter = f"format=nv12,{gpu_filter},format=yuv420p"
|
304 |
-
|
305 |
-
return gpu_filter
|
306 |
-
|
307 |
-
|
308 |
def compose_video(
|
309 |
prompt: str,
|
310 |
files: list = None,
|
|
|
139 |
- If the user asks for waveform visualization make sure to set the mode to `line` with and the use the full width of the video. Also concatenate the audio into a single channel.
|
140 |
- For image sequences: Use -framerate and pattern matching (like 'img%d.jpg') when possible, falling back to individual image processing with -loop 1 and appropriate filters only when necessary.
|
141 |
- When showing file operations or commands, always use explicit paths and filenames without wildcards - avoid using asterisk (*) or glob patterns. Instead, use specific numbered sequences (like %d), explicit file lists, or show the full filename.
|
|
|
|
|
142 |
|
143 |
Remember: Simpler is better. Only use advanced ffmpeg features if absolutely necessary for the requested output.
|
144 |
""",
|
|
|
229 |
@spaces.GPU(duration=120)
|
230 |
def execute_ffmpeg_command(args, temp_dir, output_file_path):
|
231 |
"""Execute FFmpeg command with GPU acceleration"""
|
232 |
+
final_command = args + ["-y", output_file_path]
|
|
|
|
|
233 |
print(f"\n=== EXECUTING FFMPEG COMMAND ===\nffmpeg {' '.join(final_command[1:])}\n")
|
234 |
subprocess.run(final_command, cwd=temp_dir)
|
235 |
return output_file_path
|
236 |
|
237 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
238 |
def compose_video(
|
239 |
prompt: str,
|
240 |
files: list = None,
|