Bước 18 — Final package intro + main + outro + BGM trên worker theo workflow audio-safe Mục tiêu: - Ghép intro + main story đã QA đạt + outro thành bản video hoàn chỉnh. - Mix thêm BGM nền nhưng không làm lệch sync narration và subtitle. - Xuất file final candidate để chuyển sang bước 19 QA cuối và ghi output/info.json. Service dùng: - Audio-safe final package worker: http://192.168.1.104:8018 - Endpoint chính: /package-audio-safe - QA phụ nếu cần: /blackdetect Input bắt buộc: - output/intro/intro.mp4 - output/main_story.mp4, phải là bản main đã pass bước 16 - /data/video-pipeline/Youtube-Video-Maker/data/outtro/outtro1_1080p.mp4 - /data/video-pipeline/Youtube-Video-Maker/data/music/the_mountain-history-archive-145197/the_mountain-history-archive-145197.mp3 - output/thumbnails/thumb_16x9_final.png - output/thumbnails/thumb_9x16_final.png Mức âm lượng BGM mặc định: - bgm_volume=0.20 - Mốc này đã được user QA/chốt trong project Ngô Quyền; vẫn phải QA lại ở bước 19 để xác nhận BGM không che tiếng đọc. Nguyên tắc bắt buộc: - Dùng đúng output/main_story.mp4 đã QA đạt làm source of truth. - Không lấy nhầm bản render cũ, bản uncompensated, bản full render test, hay file chưa QA. - Không package audio/video-heavy trên host. - Packaging phải audio-safe: giữ timing narration ổn định, không để intro/outro/BGM làm trôi tiếng. - Không stream-copy concat audio nếu sample rate giữa intro/main/outro khác nhau. - Không coi file package là approved final nếu chưa qua bước 19. Request mẫu: ```json { "intro_video_path": ".../output/intro/intro.mp4", "main_video_path": ".../output/main_story.mp4", "outro_video_path": "/data/video-pipeline/Youtube-Video-Maker/data/outtro/outtro1_1080p.mp4", "bgm_audio_path": "/data/video-pipeline/Youtube-Video-Maker/data/music/the_mountain-history-archive-145197/the_mountain-history-archive-145197.mp3", "output_video_path": ".../output/final/final_video.mp4", "sample_rate": 24000, "channels": 1, "bgm_volume": 0.20 } ``` Output bắt buộc: - output/final/final_video.mp4 - output/final/final_video_probe.json - output/final/final_package_report.json - output/final/final_blackdetect.json nếu chạy blackdetect - logs/step18_final_package_manifest.json Validation bắt buộc trước khi sang bước 19: - File final tồn tại. - Có audio stream và video stream. - Thứ tự intro -> main -> outro đúng. - Duration hợp lý so với tổng intro + main + outro. - Không black frame bất thường rõ ràng. - BGM không lấn narration, sẽ QA lại ở bước 19. - Sync phần main vẫn dựa trên bản main đã QA ở bước 16. Bước này phục vụ trực tiếp cho: - Bước 19: QA final, viết output/info.json, và chỉ khi đó mới báo approved output. Một câu ngắn: - Bước 18 dùng worker 8018 /package-audio-safe để ghép intro + main đã QA + outro, mix BGM volume=0.20, probe/blackdetect và tạo final candidate cho bước 19.