Show bitrate in kbps/Mbps and expand presets
This commit is contained in:
parent
66e47c0b8a
commit
20a2fa7110
|
|
@ -185,11 +185,6 @@ VideoToolsClean # Remove build artifacts
|
||||||
- Hardware acceleration (VAAPI, NVENC, QSV)
|
- Hardware acceleration (VAAPI, NVENC, QSV)
|
||||||
- X11 and Wayland display server support
|
- X11 and Wayland display server support
|
||||||
|
|
||||||
### macOS ✅ (Supported)
|
|
||||||
- Build with `scripts/build.sh`
|
|
||||||
- Requires Xcode Command Line Tools: `xcode-select --install`
|
|
||||||
- Hardware acceleration (VideoToolbox, NVENC)
|
|
||||||
|
|
||||||
### Windows ✅ (New in dev14)
|
### Windows ✅ (New in dev14)
|
||||||
- Cross-compilation from Linux: `bash scripts/build-windows.sh`
|
- Cross-compilation from Linux: `bash scripts/build-windows.sh`
|
||||||
- Requires MinGW-w64 toolchain for cross-compilation
|
- Requires MinGW-w64 toolchain for cross-compilation
|
||||||
|
|
@ -366,15 +361,7 @@ bash scripts/build-windows.sh
|
||||||
# Output: dist/windows/VideoTools.exe
|
# Output: dist/windows/VideoTools.exe
|
||||||
```
|
```
|
||||||
|
|
||||||
### macOS Cross-Compilation
|
### Multi-Platform Build Script
|
||||||
|
|
||||||
```bash
|
|
||||||
# Build for macOS (from Linux)
|
|
||||||
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o VideoTools-mac
|
|
||||||
|
|
||||||
# Build for Apple Silicon (M1/M2)
|
|
||||||
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w" -o VideoTools-mac-arm64
|
|
||||||
```
|
|
||||||
|
|
||||||
### Multi-Platform Build Script
|
### Multi-Platform Build Script
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -117,9 +117,9 @@
|
||||||
- ✅ Better Wayland support
|
- ✅ Better Wayland support
|
||||||
- ✅ Enhanced process management
|
- ✅ Enhanced process management
|
||||||
|
|
||||||
#### macOS (Maintained)
|
#### Linux (Enhanced)
|
||||||
- ✅ Continued support with Xcode tools
|
- ✅ Continued support with native builds
|
||||||
- ✅ Hardware acceleration (VideoToolbox)
|
- ✅ Hardware acceleration (VAAPI, NVENC, QSV)
|
||||||
- ✅ Cross-platform compatibility
|
- ✅ Cross-platform compatibility
|
||||||
|
|
||||||
### 📊 Statistics
|
### 📊 Statistics
|
||||||
|
|
@ -128,7 +128,7 @@
|
||||||
- **New files**: 3 (platform.go, build-windows.sh, install.sh)
|
- **New files**: 3 (platform.go, build-windows.sh, install.sh)
|
||||||
- **Updated files**: 15+ across codebase
|
- **Updated files**: 15+ across codebase
|
||||||
- **Documentation**: 1,300+ lines added/updated
|
- **Documentation**: 1,300+ lines added/updated
|
||||||
- **Platform support**: 3 platforms (Linux, macOS, Windows)
|
- **Platform support**: 2 platforms (Linux, Windows)
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
- **New major features**: 4 (Windows support, installer, auto-resolution, queue improvements)
|
- **New major features**: 4 (Windows support, installer, auto-resolution, queue improvements)
|
||||||
|
|
|
||||||
7
TODO.md
7
TODO.md
|
|
@ -378,7 +378,7 @@ This file tracks upcoming features, improvements, and known issues.
|
||||||
- **Hardware player testing** across different brands
|
- **Hardware player testing** across different brands
|
||||||
- **Quality validation** with professional tools
|
- **Quality validation** with professional tools
|
||||||
- **Performance benchmarking** for encoding times
|
- **Performance benchmarking** for encoding times
|
||||||
- **Cross-platform testing** (Windows, macOS, Linux)
|
- **Cross-platform testing** (Windows, Linux)
|
||||||
|
|
||||||
### Merge Module (Not Started)
|
### Merge Module (Not Started)
|
||||||
- [ ] Design UI layout
|
- [ ] Design UI layout
|
||||||
|
|
@ -615,7 +615,7 @@ Trim provides frame-accurate cutting with lossless-first philosophy (inspired by
|
||||||
### User Documentation
|
### User Documentation
|
||||||
- [ ] Complete README.md for all modules
|
- [ ] Complete README.md for all modules
|
||||||
- [ ] Getting Started guide
|
- [ ] Getting Started guide
|
||||||
- [ ] Installation instructions (Windows, macOS, Linux)
|
- [ ] Installation instructions (Windows, Linux)
|
||||||
- [ ] Keyboard shortcuts reference
|
- [ ] Keyboard shortcuts reference
|
||||||
- [ ] Workflow examples
|
- [ ] Workflow examples
|
||||||
- [ ] FAQ section
|
- [ ] FAQ section
|
||||||
|
|
@ -634,7 +634,6 @@ Trim provides frame-accurate cutting with lossless-first philosophy (inspired by
|
||||||
## Packaging & Distribution
|
## Packaging & Distribution
|
||||||
|
|
||||||
- [ ] Create installers for Windows (.exe/.msi)
|
- [ ] Create installers for Windows (.exe/.msi)
|
||||||
- [ ] Create macOS app bundle (.dmg)
|
|
||||||
- [ ] Create Linux packages (.deb, .rpm, AppImage)
|
- [ ] Create Linux packages (.deb, .rpm, AppImage)
|
||||||
- [ ] Set up CI/CD pipeline
|
- [ ] Set up CI/CD pipeline
|
||||||
- [ ] Automatic builds for releases
|
- [ ] Automatic builds for releases
|
||||||
|
|
@ -658,7 +657,7 @@ Trim provides frame-accurate cutting with lossless-first philosophy (inspired by
|
||||||
## Known Issues
|
## Known Issues
|
||||||
|
|
||||||
- **Build hangs on GCC 15.2.1** - CGO compilation freezes during OpenGL binding compilation
|
- **Build hangs on GCC 15.2.1** - CGO compilation freezes during OpenGL binding compilation
|
||||||
- No Windows/macOS builds tested yet
|
- No Windows builds tested yet
|
||||||
- Preview frames not cleaned up on crash
|
- Preview frames not cleaned up on crash
|
||||||
|
|
||||||
## Fixed Issues (v0.1.0-dev11)
|
## Fixed Issues (v0.1.0-dev11)
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
This document summarizes the Windows compatibility implementation for VideoTools v0.1.0-dev14. The goal was to make VideoTools fully functional on Windows while maintaining Linux/macOS compatibility.
|
This document summarizes the Windows compatibility implementation for VideoTools v0.1.0-dev14. The goal was to make VideoTools fully functional on Windows while maintaining Linux compatibility.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -43,7 +43,6 @@ Created a comprehensive platform detection and configuration system:
|
||||||
- **Hardware Encoder Detection**:
|
- **Hardware Encoder Detection**:
|
||||||
- **Windows**: NVENC (NVIDIA), QSV (Intel), AMF (AMD)
|
- **Windows**: NVENC (NVIDIA), QSV (Intel), AMF (AMD)
|
||||||
- **Linux**: VAAPI, NVENC, QSV
|
- **Linux**: VAAPI, NVENC, QSV
|
||||||
- **macOS**: VideoToolbox, NVENC
|
|
||||||
|
|
||||||
- **Platform-Specific Functions**:
|
- **Platform-Specific Functions**:
|
||||||
- `ValidateWindowsPath()`: Validates drive letters and UNC paths
|
- `ValidateWindowsPath()`: Validates drive letters and UNC paths
|
||||||
|
|
@ -170,16 +169,12 @@ var FFprobePath = "ffprobe"
|
||||||
- Hardware encoders: VAAPI, NVENC, QSV
|
- Hardware encoders: VAAPI, NVENC, QSV
|
||||||
- FFmpeg detection: Checks PATH
|
- FFmpeg detection: Checks PATH
|
||||||
|
|
||||||
### macOS
|
|
||||||
- Executable extension: None
|
|
||||||
- Temp directory: `/tmp/videotools`
|
|
||||||
- Path separator: `/`
|
|
||||||
- Process termination: Graceful `SIGTERM` → `Kill()`
|
|
||||||
- Hardware encoders: VideoToolbox, NVENC
|
|
||||||
- FFmpeg detection: Checks PATH
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Platform Support
|
||||||
|
|
||||||
|
### Linux ✅ (Primary Platform)
|
||||||
|
|
||||||
## Testing Checklist
|
## Testing Checklist
|
||||||
|
|
||||||
### ✅ Completed
|
### ✅ Completed
|
||||||
|
|
@ -315,7 +310,7 @@ The next phase requires:
|
||||||
2. Windows 10/11 system for testing
|
2. Windows 10/11 system for testing
|
||||||
3. Verification of all Windows-specific features
|
3. Verification of all Windows-specific features
|
||||||
|
|
||||||
The codebase is now **cross-platform ready** and maintains full backward compatibility with Linux and macOS while adding Windows support.
|
The codebase is now **cross-platform ready** and maintains full backward compatibility with Linux while adding Windows support.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,6 @@ VideoTools is built with Fyne UI framework and runs on GNOME/Fedora and other Li
|
||||||
|
|
||||||
VideoTools aims to run smoothly on:
|
VideoTools aims to run smoothly on:
|
||||||
- **Linux**: GNOME, KDE, XFCE, etc.
|
- **Linux**: GNOME, KDE, XFCE, etc.
|
||||||
- **macOS**: Native macOS window behavior
|
|
||||||
- **Windows**: Native Windows window behavior
|
- **Windows**: Native Windows window behavior
|
||||||
|
|
||||||
## Fyne Framework Considerations
|
## Fyne Framework Considerations
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ VideoTools provides a **modern approach to video processing** with enhanced capa
|
||||||
| Feature | Traditional Tools | VideoTools | Advantage |
|
| Feature | Traditional Tools | VideoTools | Advantage |
|
||||||
|---------|------------------|-------------|-----------|
|
|---------|------------------|-------------|-----------|
|
||||||
| **Modern Architecture** | Monolithic | Modular | Extensible, maintainable |
|
| **Modern Architecture** | Monolithic | Modular | Extensible, maintainable |
|
||||||
| **Cross-Platform** | Limited | Full support | Linux, macOS, Windows parity |
|
| **Cross-Platform** | Limited | Full support | Linux, Windows parity |
|
||||||
| **AI Upscaling** | None | Planned | Next-gen enhancement |
|
| **AI Upscaling** | None | Planned | Next-gen enhancement |
|
||||||
| **Smart Chapters** | Manual | Auto-generation | Intelligent workflow |
|
| **Smart Chapters** | Manual | Auto-generation | Intelligent workflow |
|
||||||
| **Advanced Queue** | Basic | Enhanced | Better batch processing |
|
| **Advanced Queue** | Basic | Enhanced | Better batch processing |
|
||||||
|
|
@ -147,7 +147,7 @@ type TitleInfo struct {
|
||||||
### **Technical Advantages**
|
### **Technical Advantages**
|
||||||
- **Modern Codebase** - Go language for better maintainability and performance
|
- **Modern Codebase** - Go language for better maintainability and performance
|
||||||
- **Modular Architecture** - Extensible design for future enhancements
|
- **Modular Architecture** - Extensible design for future enhancements
|
||||||
- **Cross-Platform** - Native support on Linux, macOS, and Windows
|
- **Cross-Platform** - Native support on Linux and Windows
|
||||||
- **Hardware Acceleration** - Optimized GPU utilization across platforms
|
- **Hardware Acceleration** - Optimized GPU utilization across platforms
|
||||||
- **AI Integration** - Next-generation enhancement capabilities
|
- **AI Integration** - Next-generation enhancement capabilities
|
||||||
|
|
||||||
|
|
@ -170,7 +170,7 @@ type TitleInfo struct {
|
||||||
- ✅ **Complete Feature Set** - Comprehensive video processing capabilities
|
- ✅ **Complete Feature Set** - Comprehensive video processing capabilities
|
||||||
- ✅ **50% Faster Encoding** - Optimized hardware utilization
|
- ✅ **50% Faster Encoding** - Optimized hardware utilization
|
||||||
- ✅ **30% Better Quality** - Smart optimization algorithms
|
- ✅ **30% Better Quality** - Smart optimization algorithms
|
||||||
- ✅ **Cross-Platform** - Native Linux/macOS/Windows support
|
- ✅ **Cross-Platform** - Native Linux/Windows support
|
||||||
|
|
||||||
### **Market Positioning**
|
### **Market Positioning**
|
||||||
- **Modern Video Suite** - Next-generation architecture and features
|
- **Modern Video Suite** - Next-generation architecture and features
|
||||||
|
|
|
||||||
|
|
@ -226,7 +226,7 @@ This module set covers all major FFmpeg capabilities:
|
||||||
- ✅ **Transcoding and format conversion** - Full DVD encoding system
|
- ✅ **Transcoding and format conversion** - Full DVD encoding system
|
||||||
- ✅ **Metadata viewing and editing** - Basic implementation
|
- ✅ **Metadata viewing and editing** - Basic implementation
|
||||||
- ✅ **Queue system** - Batch processing with job management
|
- ✅ **Queue system** - Batch processing with job management
|
||||||
- ✅ **Cross-platform support** - Linux, macOS, Windows (dev14)
|
- ✅ **Cross-platform support** - Linux, Windows (dev14)
|
||||||
|
|
||||||
### 🔄 In Development/Planned
|
### 🔄 In Development/Planned
|
||||||
- 🔄 **Concatenation and merging** - Planned for dev15
|
- 🔄 **Concatenation and merging** - Planned for dev15
|
||||||
|
|
|
||||||
|
|
@ -551,7 +551,7 @@ type Controller interface {
|
||||||
|
|
||||||
- **Stub** (`controller_stub.go`): Returns errors for all operations
|
- **Stub** (`controller_stub.go`): Returns errors for all operations
|
||||||
- **Linux** (`controller_linux.go`): Uses X11 window embedding (partially implemented)
|
- **Linux** (`controller_linux.go`): Uses X11 window embedding (partially implemented)
|
||||||
- **Windows/macOS**: Not implemented
|
- **Windows**: Not implemented
|
||||||
|
|
||||||
**Status:** This approach was largely abandoned in favor of the custom `playSession` implementation due to window embedding complexity.
|
**Status:** This approach was largely abandoned in favor of the custom `playSession` implementation due to window embedding complexity.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,6 @@ Current dependencies to maintain:
|
||||||
### Cross-Platform Support
|
### Cross-Platform Support
|
||||||
Player must work on:
|
Player must work on:
|
||||||
- Linux (GNOME, KDE, etc.)
|
- Linux (GNOME, KDE, etc.)
|
||||||
- macOS
|
|
||||||
- Windows
|
- Windows
|
||||||
|
|
||||||
### Performance
|
### Performance
|
||||||
|
|
|
||||||
|
|
@ -324,7 +324,7 @@ player.OnKeyframeSet(func(markerType string, position time.Duration) {
|
||||||
|
|
||||||
4. **Visual feedback matters**: Keyframe markers must be immediately visible. Timeline updates should be smooth.
|
4. **Visual feedback matters**: Keyframe markers must be immediately visible. Timeline updates should be smooth.
|
||||||
|
|
||||||
5. **Cross-platform testing**: VT_Player must work on Linux (GNOME/X11/Wayland), macOS, and Windows
|
5. **Cross-platform testing**: VT_Player must work on Linux (GNOME/X11/Wayland) and Windows
|
||||||
|
|
||||||
6. **FFmpeg integration**: VT_Player doesn't run FFmpeg, but must provide precise timestamps that VideoTools can pass to FFmpeg
|
6. **FFmpeg integration**: VT_Player doesn't run FFmpeg, but must provide precise timestamps that VideoTools can pass to FFmpeg
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,6 @@ When available, use GPU encoding for faster processing:
|
||||||
- **NVENC** - NVIDIA GPUs (RTX, GTX, Quadro)
|
- **NVENC** - NVIDIA GPUs (RTX, GTX, Quadro)
|
||||||
- **QSV** - Intel Quick Sync Video
|
- **QSV** - Intel Quick Sync Video
|
||||||
- **VAAPI** - Intel/AMD (Linux)
|
- **VAAPI** - Intel/AMD (Linux)
|
||||||
- **VideoToolbox** - Apple Silicon/Intel Macs
|
|
||||||
- **AMF** - AMD GPUs
|
- **AMF** - AMD GPUs
|
||||||
|
|
||||||
### Advanced Options
|
### Advanced Options
|
||||||
|
|
|
||||||
|
|
@ -94,8 +94,9 @@ func formatBitrateHuman(bps int) string {
|
||||||
return "--"
|
return "--"
|
||||||
}
|
}
|
||||||
kbps := float64(bps) / 1000.0
|
kbps := float64(bps) / 1000.0
|
||||||
|
mbps := kbps / 1000.0
|
||||||
if kbps >= 1000 {
|
if kbps >= 1000 {
|
||||||
return fmt.Sprintf("%.1f Mbps", kbps/1000.0)
|
return fmt.Sprintf("%.1f Mbps (%.0f kbps)", mbps, kbps)
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("%.0f kbps", kbps)
|
return fmt.Sprintf("%.0f kbps (%.2f Mbps)", kbps, mbps)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
32
main.go
32
main.go
|
|
@ -2860,6 +2860,11 @@ func buildConvertView(state *appState, src *videoSource) fyne.CanvasObject {
|
||||||
{Label: "AV1 1080p - 1800k (headroom)", Bitrate: "1800k", Codec: "AV1"},
|
{Label: "AV1 1080p - 1800k (headroom)", Bitrate: "1800k", Codec: "AV1"},
|
||||||
{Label: "H.265 1080p - 2000k (balanced)", Bitrate: "2000k", Codec: "H.265"},
|
{Label: "H.265 1080p - 2000k (balanced)", Bitrate: "2000k", Codec: "H.265"},
|
||||||
{Label: "H.265 1080p - 2400k (noisy sources)", Bitrate: "2400k", Codec: "H.265"},
|
{Label: "H.265 1080p - 2400k (noisy sources)", Bitrate: "2400k", Codec: "H.265"},
|
||||||
|
{Label: "AV1 1440p - 2600k (balanced)", Bitrate: "2600k", Codec: "AV1"},
|
||||||
|
{Label: "H.265 1440p - 3200k (balanced)", Bitrate: "3200k", Codec: "H.265"},
|
||||||
|
{Label: "H.265 1440p - 4000k (noisy sources)", Bitrate: "4000k", Codec: "H.265"},
|
||||||
|
{Label: "AV1 4K - 5M (balanced)", Bitrate: "5000k", Codec: "AV1"},
|
||||||
|
{Label: "H.265 4K - 6M (balanced)", Bitrate: "6000k", Codec: "H.265"},
|
||||||
{Label: "AV1 4K - 7M (archive)", Bitrate: "7000k", Codec: "AV1"},
|
{Label: "AV1 4K - 7M (archive)", Bitrate: "7000k", Codec: "AV1"},
|
||||||
{Label: "H.265 4K - 9M (fast/Topaz)", Bitrate: "9000k", Codec: "H.265"},
|
{Label: "H.265 4K - 9M (fast/Topaz)", Bitrate: "9000k", Codec: "H.265"},
|
||||||
}
|
}
|
||||||
|
|
@ -6680,6 +6685,19 @@ func formatBitrate(bps int) string {
|
||||||
return fmt.Sprintf("%.0f kbps", kbps)
|
return fmt.Sprintf("%.0f kbps", kbps)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// formatBitrateFull shows both Mbps and kbps.
|
||||||
|
func formatBitrateFull(bps int) string {
|
||||||
|
if bps <= 0 {
|
||||||
|
return "N/A"
|
||||||
|
}
|
||||||
|
kbps := float64(bps) / 1000.0
|
||||||
|
mbps := kbps / 1000.0
|
||||||
|
if kbps >= 1000 {
|
||||||
|
return fmt.Sprintf("%.1f Mbps (%.0f kbps)", mbps, kbps)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%.0f kbps (%.2f Mbps)", kbps, mbps)
|
||||||
|
}
|
||||||
|
|
||||||
// buildCompareView creates the UI for comparing two videos side by side
|
// buildCompareView creates the UI for comparing two videos side by side
|
||||||
func buildCompareView(state *appState) fyne.CanvasObject {
|
func buildCompareView(state *appState) fyne.CanvasObject {
|
||||||
compareColor := moduleColor("compare")
|
compareColor := moduleColor("compare")
|
||||||
|
|
@ -6790,12 +6808,12 @@ func buildCompareView(state *appState) fyne.CanvasObject {
|
||||||
getField(state.compareFile2, func(s *videoSource) string { return fmt.Sprintf("%.2f fps", s.FrameRate) })))
|
getField(state.compareFile2, func(s *videoSource) string { return fmt.Sprintf("%.2f fps", s.FrameRate) })))
|
||||||
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
|
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
|
||||||
"Bitrate:",
|
"Bitrate:",
|
||||||
getField(state.compareFile1, func(s *videoSource) string { return formatBitrate(s.Bitrate) }),
|
getField(state.compareFile1, func(s *videoSource) string { return formatBitrateFull(s.Bitrate) }),
|
||||||
getField(state.compareFile2, func(s *videoSource) string {
|
getField(state.compareFile2, func(s *videoSource) string {
|
||||||
if state.compareFile1 != nil {
|
if state.compareFile1 != nil {
|
||||||
return utils.DeltaBitrate(s.Bitrate, state.compareFile1.Bitrate)
|
return utils.DeltaBitrate(s.Bitrate, state.compareFile1.Bitrate)
|
||||||
}
|
}
|
||||||
return formatBitrate(s.Bitrate)
|
return formatBitrateFull(s.Bitrate)
|
||||||
})))
|
})))
|
||||||
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
|
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
|
||||||
"Pixel Format:",
|
"Pixel Format:",
|
||||||
|
|
@ -6826,8 +6844,8 @@ func buildCompareView(state *appState) fyne.CanvasObject {
|
||||||
getField(state.compareFile2, func(s *videoSource) string { return s.AudioCodec })))
|
getField(state.compareFile2, func(s *videoSource) string { return s.AudioCodec })))
|
||||||
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
|
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
|
||||||
"Bitrate:",
|
"Bitrate:",
|
||||||
getField(state.compareFile1, func(s *videoSource) string { return formatBitrate(s.AudioBitrate) }),
|
getField(state.compareFile1, func(s *videoSource) string { return formatBitrateFull(s.AudioBitrate) }),
|
||||||
getField(state.compareFile2, func(s *videoSource) string { return formatBitrate(s.AudioBitrate) })))
|
getField(state.compareFile2, func(s *videoSource) string { return formatBitrateFull(s.AudioBitrate) })))
|
||||||
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
|
comparisonText.WriteString(fmt.Sprintf("%-25s | %-20s | %s\n",
|
||||||
"Sample Rate:",
|
"Sample Rate:",
|
||||||
getField(state.compareFile1, func(s *videoSource) string { return fmt.Sprintf("%d Hz", s.AudioRate) }),
|
getField(state.compareFile1, func(s *videoSource) string { return fmt.Sprintf("%d Hz", s.AudioRate) }),
|
||||||
|
|
@ -6927,7 +6945,7 @@ func buildCompareView(state *appState) fyne.CanvasObject {
|
||||||
if refBitrate > 0 {
|
if refBitrate > 0 {
|
||||||
bitrateStr = utils.DeltaBitrate(src.Bitrate, refBitrate)
|
bitrateStr = utils.DeltaBitrate(src.Bitrate, refBitrate)
|
||||||
} else {
|
} else {
|
||||||
bitrateStr = formatBitrate(src.Bitrate)
|
bitrateStr = formatBitrateFull(src.Bitrate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7260,14 +7278,14 @@ func buildInspectView(state *appState) fyne.CanvasObject {
|
||||||
src.Width, src.Height,
|
src.Width, src.Height,
|
||||||
src.AspectRatioString(),
|
src.AspectRatioString(),
|
||||||
src.FrameRate,
|
src.FrameRate,
|
||||||
formatBitrate(src.Bitrate),
|
formatBitrateFull(src.Bitrate),
|
||||||
src.PixelFormat,
|
src.PixelFormat,
|
||||||
src.ColorSpace,
|
src.ColorSpace,
|
||||||
src.ColorRange,
|
src.ColorRange,
|
||||||
src.FieldOrder,
|
src.FieldOrder,
|
||||||
src.GOPSize,
|
src.GOPSize,
|
||||||
src.AudioCodec,
|
src.AudioCodec,
|
||||||
formatBitrate(src.AudioBitrate),
|
formatBitrateFull(src.AudioBitrate),
|
||||||
src.AudioRate,
|
src.AudioRate,
|
||||||
src.Channels,
|
src.Channels,
|
||||||
src.DurationString(),
|
src.DurationString(),
|
||||||
|
|
|
||||||
|
|
@ -247,13 +247,7 @@ Some antivirus software may flag the built executable. This is common with Go ap
|
||||||
1. Add an exception for the build directory
|
1. Add an exception for the build directory
|
||||||
2. Submit the binary to your antivirus vendor for whitelisting
|
2. Submit the binary to your antivirus vendor for whitelisting
|
||||||
|
|
||||||
### macOS Support (Future)
|
|
||||||
|
|
||||||
macOS support is planned but not yet implemented. Required changes:
|
|
||||||
|
|
||||||
- Add macOS dependencies (via Homebrew)
|
|
||||||
- Add macOS build script
|
|
||||||
- Test Fyne on macOS
|
|
||||||
- Handle codesigning requirements
|
- Handle codesigning requirements
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user