Skip to content

MP3/ses dosyasından kayıpsız video dışa aktarma (CPU/GPU) - #1

Merged
CaYatur merged 1 commit into
mainfrom
feat/video-export
Jun 24, 2026
Merged

MP3/ses dosyasından kayıpsız video dışa aktarma (CPU/GPU)#1
CaYatur merged 1 commit into
mainfrom
feat/video-export

Conversation

@CaYatur

@CaYatur CaYatur commented Jun 24, 2026

Copy link
Copy Markdown
Owner

Genel Bakış

Bir ses dosyasını (MP3/WAV/FLAC…) mevcut görsel ayarlarla kayıpsız H.264 MP4'e dönüştüren "Video Dışa Aktar" özelliği eklendi. Ekran/ses kaydı yapılmaz — her video karesi offline ve deterministik render edilir, ses kaynaktan birebir kopyalanır.

Ne değişti

  • Offline render motoru (src/exporter/): gizli bir BrowserWindow, mevcut görselleştirici modlarını (WebGL gradyan + 2D bar/dalga/çember + logo) yeniden kullanarak her kareyi t = frame/fps ile deterministik çizer. FFT, loopback-helper.js ile birebir aynı ölçekte hesaplanır (Hann pencere, dB ölçeği) — böylece çıktı canlı görünümle aynıdır.
  • Boru hattı: ham RGBA kareler, drain geri basıncıyla IPC üzerinden ana sürece akıtılır; ffmpeg-static ile yuv420p H.264'e kodlanır, ses -c:a copy (mp3/m4a/aac) ile yeniden kodlanmadan gömülür (aksi halde AAC 320k).
  • CPU/GPU kodlayıcı seçimi: libx264 (CPU) veya h264_nvenc (NVIDIA NVENC, GPU). NVENC bu makinede gerçekten çalışıyor mu diye fonksiyonel olarak test edilir; yoksa otomatik CPU'ya düşülür (hem UI hem export:start tarafında).
  • Admin UI: yeni "🎬 Video Dışa Aktar" bölümü — dosya seç, çözünürlük (720p–4K), FPS (30/60), kodlayıcı, kalite kademeleri, ilerleme çubuğu ve iptal.
  • ffmpeg-static bağımlılığı eklendi ve asarUnpack'e dahil edildi.

Neden

Görselleştirmeyi ekran kaydı kalite kaybı olmadan, kare-doğru ve sesi bozmadan video olarak paylaşabilmek için.

Gözden geçiren için notlar

  • Doğrulama: ffmpeg boru hattı ve tam render hattı (gizli pencerede WebGL + decodeAudioData + FFT + piksel okuma + IPC) hem CPU hem GPU yolu için headless entegrasyon testiyle uçtan uca doğrulandı; geçerli H.264 yuv420p + MP3 kopya MP4 üretiyor.
  • macOS derleme uyarısı: ffmpeg-static, npm install sırasında yalnızca o anki platformun ikilisini indirir. dist:mac bir mac üzerinde derlenmeli; aksi halde mac paketine ffmpeg girmez.
  • Performans: 1080p'de asıl darboğaz çoğunlukla render+readback+IPC (encode değil); GPU asıl 1440p/4K'da belirgin hızlanma sağlar.

🤖 Generated with Claude Code

Yeni "Video Disa Aktar" ozelligi: secilen bir ses dosyasi, mevcut gorsel
ayarlarla kayipsiz H.264 MP4'e donusturulur. Ekran/ses kaydi yapilmaz —
gizli bir render penceresi her kareyi offline ve deterministik cizer,
FFT'yi loopback-helper.js ile birebir ayni olcekte hesaplar, ham RGBA
kareleri geri basincli IPC ile ana surece akitir; ffmpeg-static ile
yuv420p H.264'e kodlanir ve ses kaynaktan -c:a copy ile birebir gomulur.

- CPU (libx264) / GPU (NVIDIA NVENC) kodlayici secimi; NVENC fonksiyonel
  olarak algilanir, yoksa otomatik CPU'ya duser.
- Cozunurluk (720p-4K), FPS (30/60), kalite kademeleri ve ilerleme/iptal.
- ffmpeg-static bagimliligi eklendi ve asarUnpack'e dahil edildi.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings June 24, 2026 11:25
@CaYatur
CaYatur merged commit e08d41b into main Jun 24, 2026
1 check passed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Bu PR, seçilen bir ses dosyasını (MP3/WAV/FLAC vb.) mevcut görselleştirici ayarlarıyla offline/deterministik şekilde kare kare render ederek H.264 MP4 olarak dışa aktaran yeni “Video Dışa Aktar” özelliğini ekliyor (ekran/ses kaydı olmadan). Ana süreç ffmpeg ile kodlamayı yönetiyor; render tarafı gizli bir BrowserWindow içinde RGBA kareler üretiyor ve IPC ile ana sürece akıtıyor.

Changes:

  • Offline render penceresi + render motoru (src/exporter/*) eklendi; görselleştirici modları yeniden kullanılıyor.
  • Ana süreçte ffmpeg boru hattı, NVENC doğrulama (GPU/CPU fallback), dışa aktarma IPC’leri ve iptal/ilerleme akışı eklendi.
  • Admin UI’da “🎬 Video Dışa Aktar” bölümü ve ffmpeg-static bağımlılığı/paketleme ayarları eklendi.

Reviewed changes

Copilot reviewed 9 out of 10 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
src/shared/defaults.js Dışa aktarma için varsayılan ayarları (export.*) ekler.
src/main/preload-exporter.js Exporter render penceresi için IPC köprüsünü (window.exp) ekler.
src/main/preload-admin.js Admin UI’ın dışa aktarma IPC çağrılarını ve event aboneliklerini ekler.
src/main/main.js ffmpeg pipeline’ı, GPU NVENC doğrulaması, render penceresi oluşturma ve export yaşam döngüsü yönetimini ekler.
src/exporter/index.html Offline render penceresi HTML’i ve gerekli script import’larını ekler.
src/exporter/exporter.js Ses çözme + FFT + kare render + IPC ile frame akıtma yapan offline render motorunu ekler.
src/admin/admin.js Admin paneline ses seçimi, export seçenekleri ve ilerleme/iptal UI mantığını ekler.
src/admin/admin.css Export paneli için UI stillerini ekler.
package.json ffmpeg-static bağımlılığını ve asarUnpack kapsamını ekler; sürümü 1.0.1’e çıkarır.
package-lock.json ffmpeg-static ve transitif bağımlılıkları kilit dosyasına ekler.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/main/main.js
Comment on lines +384 to +406
opts = opts || {};
const audioPath = opts.audioPath;
const outputPath = opts.outputPath;
if (!audioPath || !fs.existsSync(audioPath)) return { ok: false, error: 'Ses dosyası bulunamadı.' };
if (!outputPath) return { ok: false, error: 'Çıktı yolu seçilmedi.' };

const [w, h] = RES_MAP[opts.resolution] || RES_MAP['1080p'];
const fps = opts.fps === 30 ? 30 : 60;

// Kodlayıcı seçimi: GPU (NVENC) istendi ama yoksa sessizce CPU'ya düş.
let encoder = opts.encoder === 'gpu' ? 'gpu' : 'cpu';
if (encoder === 'gpu' && !(await detectGpuEncoder())) encoder = 'cpu';
const videoArgs = buildVideoArgs(encoder, opts.quality);

// Ses akışını kayıpsız kopyala (mp4 uyumlu kodek). Değilse şeffaf AAC'e dön.
const ext = path.extname(audioPath).toLowerCase();
const audioCopy = ['.mp3', '.m4a', '.aac'].includes(ext);
const audioArgs = audioCopy ? ['-c:a', 'copy'] : ['-c:a', 'aac', '-b:a', '320k'];

const args = [
'-y',
'-f', 'rawvideo',
'-pixel_format', 'rgba',
Comment thread src/main/main.js
Comment on lines +420 to +426
const ff = resolveFfmpeg();
let audioBuf;
try {
audioBuf = fs.readFileSync(audioPath);
} catch (err) {
return { ok: false, error: 'Ses dosyası okunamadı: ' + err.message };
}
Comment thread src/main/main.js
Comment on lines +485 to +488
ipcMain.handle('export:cancel', () => {
if (exportState) exportState.cancel = true;
return true;
});
Comment thread package.json
Comment on lines 31 to 34
"dependencies": {
"audify": "^1.10.1"
"audify": "^1.10.1",
"ffmpeg-static": "^5.3.0"
},
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants