Cách gửi giọng nói qua mạng Unity - UNET


7

Tôi có thể Ghi và Chạy Âm thanh từ Micrô của mình bằng đoạn mã này:

  void OnGUI() {
        if (GUI.Button(new Rect(0, 0, 100, 20), "record")) {
           // Microphone.End(Microphone.devices[0]);
            audsourceAttached.clip = Microphone.Start(Microphone.devices[0], false, 3, 44100);
        }
        if (GUI.Button(new Rect(0, 30, 100, 20), "Stop"))
        {
            //Microphone.End(Microphone.devices[0]);
            audsourceAttached.Play();
        }
    }

Bây giờ tôi sẵn sàng gửi âm thanh này qua Mạng (trên mạng cục bộ của tôi - một phiên bản khác của trò chơi). Tôi có thể làm cái này như thế nào?

Tôi đã cố gắng tìm thấy điều này trên google nhưng không thể tìm thấy bất kỳ giải pháp / liên kết hữu ích nào.

Làm cách nào tôi có thể gửi âm thanh qua micrô như Trò chuyện trong thời gian thực trong trò chơi / v.v.


1
Bình luận không hữu ích: xin đừng. Nhiều game thủ không bao giờ muốn trò chơi truyền tải âm thanh. Chúng tôi đã có Skype, Steam, TeamSpeak, và nhiều nhiều nhiều giải pháp khác cho rằng, và trò chơi của bạn sẽ can thiệp với họ.
Peter

4
Tôi không coi đây là một vấn đề, miễn là bạn có thể tắt nó theo hướng có lợi cho Skype, Steam, Teamspeak, v.v. Ngoài ra, có một số trường hợp cạnh mà âm thanh micrô được sử dụng kết hợp với vị trí nguồn của nó thay vì trò chuyện bằng giọng nói truyền thống, tức là chỉ nghe được nếu bạn đủ gần với người chơi nói trong trò chơi. Tôi nghĩ ví dụ DayZ và / hoặc ArmA làm điều này.
Christian

Đây có thể là một số mã mà bạn quan tâm: answer.unity3d.com/questions/737002/wav-byte-to-audioclip.html
Lasse

2
Tôi đồng ý rằng có rất nhiều lý do để tích hợp trò chuyện thoại trực tiếp vào trò chơi thay vì dựa vào các công cụ của bên thứ 3. Nó cho phép kết nối người chơi với nhau khi họ gặp nhau trong một thế giới mở hoặc trong một sảnh trò chơi. Trong một trò chơi dựa trên đội không có sự hồi sinh, bạn cũng có thể ngăn người chơi chết nói chuyện với người sống. Nhưng hãy nhớ rằng chỉ cần nhận dạng sóng và gửi qua mạng có thể không mang lại cho bạn kết quả rất tốt. Sẽ tốt hơn nếu mã hóa nó trong một codec âm thanh được tạo ra để mã hóa giọng nói trong thời gian thực trên băng thông thấp.
Philipp

@Philipp có thể bạn đúng nhưng tôi chỉ chia sẻ những nỗ lực của tôi rằng những gì tôi đã làm cho đến nay. Có chi tiết nào khác xin vui lòng chia sẻ câu trả lời đầy đủ của bạn
Muhammad Faizan Khan

Câu trả lời:


4

TL; DR: Bạn không thể làm điều đó một cách tự nhiên trong Unity

Microphone.Starttrả về một AudioCliptrong đó có 3 loại tải , không có loại nào phù hợp với trường hợp sử dụng của bạn. Tất cả chúng (thậm chí là .Streamingmột) yêu cầu toàn bộ clip phải có trên máy tính của người dùng. Sử dụng AudioClip.GetData()và gửi tệp qua mạng (trong Unity, sử dụng Networking.NetworkTransport.Send()) sẽ không phản hồi khủng khiếp và chỉ có thể thực sự xảy ra sau khi ghi xong clip. Điều này bỏ qua các codec âm thanh, sử dụng nhiều luồng (Unity không phải là luồng an toàn) và xử lý tính chất thời gian thực của dữ liệu thiết bị âm thanh.

Những gì bạn cần là một cách để có được dữ liệu thiết bị âm thanh trong thời gian thực mà Unity không cung cấp cơ chế nào và do đó không thể hỗ trợ RTC nguyên bản. Câu trả lời này đi đến cùng một kết luận

Giải pháp bên thứ ba tồn tại trên cửa hàng tài sản. Đây là một giải pháp như vậy được đề cập trong câu trả lời được liên kết ở trên: Trò chuyện bằng giọng nói . Đi qua danh sách các tập tin, nó sử dụng một nguồn gốc, bộ giải mã âm thanh Opus và một loạt các tệp C # để giao tiếp với mã gốc.

Cuốn sách của riêng bạn, mà tôi không khuyên dùng, sẽ yêu cầu làm như sau:

  • Sử dụng C # riêng System.Threading luồng để xử lý âm thanh của bạn để tốc độ khung hình và phát lại âm thanh của bạn không được kết hợp với nhau.
  • Lấy dữ liệu âm thanh không tầm thường trong C #. .NET sử dụng DirectSoundmột thứ Windows. Mono không hỗ trợ điều này . Điều này có nghĩa là bạn cần phải tự thực hiện một giải pháp đa nền tảng hoặc dựa vào một thư viện đã làm.
  • Vận chuyển nó qua mạng yêu cầu một ổ cắm bằng cách sử dụng .NET . Chúng có vẻ mạnh mẽ và được hỗ trợ trong Mono.
  • Ổ cắm của bạn nên vận chuyển như một multicast P2P. Điều này cho phép bạn gửi một luồng âm thanh đến nhiều người cùng một lúc. Nó cũng bỏ qua một thiết lập nhưClient ==> Server ==> Client thêm độ trễ.
  • Bạn cũng sẽ muốn một codec để đảm bảo rằng bạn không chỉ gửi âm thanh không nén willy-nilly. Có rất nhiều cái mà rất có thể yêu cầu giao tiếp với một thư viện riêng khác.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.