2013-01-21 30 views
5

Tôi nhận được một loạt các gói UDP từ một ổ chứa bộ đệm PCM được mã hóa. Sau khi giải mã chúng, tôi còn lại với bộ đệm âm thanh int16 *, mà tôi muốn phát lại ngay lập tức.iOS: Phát bộ đệm PCM từ luồng

Logic dự định đi một cái gì đó như thế này:

init(){ 
    initTrack(track, output, channels, sample_rate, ...); 
} 

onReceiveBufferFromSocket(NSData data){ 
    //Decode the buffer 
    int16 * buf = handle_data(data); 

    //Play data 
    write_to_track(track, buf, length_of_buf, etc); 
} 

Tôi không chắc chắn về tất cả những gì đã làm với chơi lại các bộ đệm mặc dù. Trên Android, tôi có thể đạt được điều này bằng cách tạo đối tượng AudioTrack, thiết lập nó bằng cách chỉ định tốc độ mẫu, định dạng, kênh, v.v ... và sau đó chỉ cần gọi phương thức "write" với bộ đệm (như tôi ước Tôi có thể trong mã giả của tôi ở trên) nhưng trên iOS tôi sắp lên ngắn.

Tôi đã thử sử dụng Dịch vụ luồng tệp âm thanh, nhưng tôi đoán tôi đang làm điều gì đó sai vì không có âm thanh nào xuất hiện và tôi cảm thấy những chức năng đó không thực sự phát lại. Tôi cũng đã cố gắng hiểu các Dịch vụ Hàng đợi Âm thanh (mà tôi nghĩ có thể gần với những gì tôi muốn), tuy nhiên tôi không thể tìm thấy bất kỳ mẫu mã đơn giản nào cho việc sử dụng nó.

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều, đặc biệt dưới dạng mã ví dụ.

+1

Xin chào, bạn đã xoay sở để giải quyết nó chưa? Tôi đang gặp sự cố tương tự, nếu có thể, vui lòng đăng mẫu mã của bạn. – moenad

Trả lời

4

Bạn cần sử dụng một số loại bộ đệm để lưu dữ liệu UDP đến. This là một bộ đệm tròn dễ dàng và tốt mà tôi đã sử dụng.

Sau đó, để phát lại dữ liệu từ bộ đệm, bạn có thể sử dụng khung Đơn vị âm thanh. Here là một dự án ví dụ tốt.

Lưu ý: Liên kết đầu tiên cũng cho bạn biết cách phát lại bằng cách sử dụng Đơn vị âm thanh.

+0

Tôi vẫn còn một chút không biết gì về cách làm điều đó. Tôi có chức năng gọi lại của bộ tiếp nhận từ ổ cắm UDP. Tôi lấy khung PCM ở đó, vì vậy những gì bạn đang nói là tôi nên có một bộ đệm tròn để chức năng có thể đặt các khung mà nó lấy ở đó, và một cuộc gọi lại khác (mà tôi không chắc chắn làm thế nào để thực hiện) kiểm tra bộ đệm và gửi các khung hình để phát lại bằng dịch vụ audiounit? Nhưng những gì gọi cuộc gọi lại thứ hai? Có vẻ như tôi không quyết định thời điểm phát âm thanh, có đúng không? –

+0

Nếu bạn xem ví dụ trong liên kết đầu tiên của tôi, có một hàm được gọi là: audioOutputCallback. Nó cho bạn thấy làm thế nào để sao chép dữ liệu từ bộ đệm tròn vào phát lại Audio Unit. Tôi vừa tạo một bản sao của hàm đó ở trên. – user523234

+0

hãy chia sẻ phần triển khai của bạn –

3

Bạn cũng có thể sử dụng các dịch vụ audioQueue, đảm bảo bạn đang thực hiện một số loại gói lại, nếu bạn sử dụng ffmpeg để giải mã các luồng có tùy chọn cho việc này.

nếu không, hàng đợi âm thanh sẽ dễ thiết lập.

https://github.com/mooncatventures-group/iFrameExtractor/blob/master/Classes/AudioController.m

Bạn cũng có thể sử dụng AudioUnits, phức tạp hơn một chút mặc dù.

Các vấn đề liên quan