124 lines
4.5 KiB
Python
124 lines
4.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Check video files for codec compatibility with ffpyplayer
|
|
"""
|
|
import os
|
|
import subprocess
|
|
import json
|
|
|
|
def check_video_codec(video_path):
|
|
"""Check video codec using ffprobe"""
|
|
try:
|
|
cmd = [
|
|
'ffprobe',
|
|
'-v', 'quiet',
|
|
'-print_format', 'json',
|
|
'-show_format',
|
|
'-show_streams',
|
|
video_path
|
|
]
|
|
|
|
result = subprocess.run(cmd, capture_output=True, text=True)
|
|
|
|
if result.returncode != 0:
|
|
return None, "ffprobe failed"
|
|
|
|
data = json.loads(result.stdout)
|
|
|
|
video_streams = [s for s in data.get('streams', []) if s.get('codec_type') == 'video']
|
|
audio_streams = [s for s in data.get('streams', []) if s.get('codec_type') == 'audio']
|
|
|
|
if not video_streams:
|
|
return None, "No video stream found"
|
|
|
|
video_stream = video_streams[0]
|
|
|
|
info = {
|
|
'codec': video_stream.get('codec_name', 'unknown'),
|
|
'codec_long': video_stream.get('codec_long_name', 'unknown'),
|
|
'width': video_stream.get('width', 0),
|
|
'height': video_stream.get('height', 0),
|
|
'fps': eval(video_stream.get('r_frame_rate', '0/1')),
|
|
'duration': float(data.get('format', {}).get('duration', 0)),
|
|
'bitrate': int(data.get('format', {}).get('bit_rate', 0)),
|
|
'audio_codec': audio_streams[0].get('codec_name', 'none') if audio_streams else 'none',
|
|
'size': int(data.get('format', {}).get('size', 0))
|
|
}
|
|
|
|
return info, None
|
|
|
|
except FileNotFoundError:
|
|
return None, "ffprobe not installed (run: sudo apt-get install ffmpeg)"
|
|
except Exception as e:
|
|
return None, str(e)
|
|
|
|
def main():
|
|
base_dir = os.path.dirname(os.path.abspath(__file__))
|
|
media_dir = os.path.join(base_dir, 'media')
|
|
|
|
print("=" * 80)
|
|
print("VIDEO CODEC COMPATIBILITY CHECKER")
|
|
print("=" * 80)
|
|
|
|
# Supported codecs by ffpyplayer
|
|
supported_codecs = ['h264', 'h265', 'hevc', 'vp8', 'vp9', 'mpeg4']
|
|
|
|
# Find video files
|
|
video_extensions = ['.mp4', '.avi', '.mkv', '.mov', '.webm']
|
|
video_files = []
|
|
|
|
if os.path.exists(media_dir):
|
|
for filename in os.listdir(media_dir):
|
|
ext = os.path.splitext(filename)[1].lower()
|
|
if ext in video_extensions:
|
|
video_files.append(filename)
|
|
|
|
if not video_files:
|
|
print("\n✓ No video files found in media directory")
|
|
return
|
|
|
|
print(f"\nFound {len(video_files)} video file(s):\n")
|
|
|
|
for filename in video_files:
|
|
video_path = os.path.join(media_dir, filename)
|
|
print(f"📹 {filename}")
|
|
print(f" Path: {video_path}")
|
|
|
|
info, error = check_video_codec(video_path)
|
|
|
|
if error:
|
|
print(f" ❌ ERROR: {error}")
|
|
continue
|
|
|
|
# Display video info
|
|
print(f" Video Codec: {info['codec']} ({info['codec_long']})")
|
|
print(f" Resolution: {info['width']}x{info['height']}")
|
|
print(f" Frame Rate: {info['fps']:.2f} fps")
|
|
print(f" Duration: {info['duration']:.1f}s")
|
|
print(f" Bitrate: {info['bitrate'] / 1000:.0f} kbps")
|
|
print(f" Audio Codec: {info['audio_codec']}")
|
|
print(f" File Size: {info['size'] / (1024*1024):.2f} MB")
|
|
|
|
# Check compatibility
|
|
if info['codec'] in supported_codecs:
|
|
print(f" ✅ COMPATIBLE - Codec '{info['codec']}' is supported by ffpyplayer")
|
|
else:
|
|
print(f" ⚠️ WARNING - Codec '{info['codec']}' may not be supported")
|
|
print(f" Supported codecs: {', '.join(supported_codecs)}")
|
|
print(f" Consider re-encoding to H.264:")
|
|
print(f" ffmpeg -i \"{filename}\" -c:v libx264 -preset fast -crf 23 \"{os.path.splitext(filename)[0]}_h264.mp4\"")
|
|
|
|
# Performance warnings
|
|
if info['width'] > 1920 or info['height'] > 1080:
|
|
print(f" ⚠️ High resolution ({info['width']}x{info['height']}) may cause performance issues")
|
|
print(f" Consider downscaling to 1920x1080 or lower")
|
|
|
|
if info['bitrate'] > 5000000: # 5 Mbps
|
|
print(f" ⚠️ High bitrate ({info['bitrate'] / 1000000:.1f} Mbps) may cause playback issues")
|
|
print(f" Consider reducing bitrate to 2-4 Mbps")
|
|
|
|
print()
|
|
|
|
if __name__ == '__main__':
|
|
main()
|