Helpex - Trao đổi & giúp đỡ Đăng nhập
61

Tôi đang sử dụng AVPlayercho một ứng dụng radio bằng tính năng phát trực tiếp HTTP. Bây giờ tôi muốn triển khai đồng hồ đo mức cho luồng âm thanh đó. Tốt nhất là một đồng hồ đo mức hiển thị các tần số khác nhau, nhưng một giải pháp đơn giản trái / phải sẽ là một điểm khởi đầu tuyệt vời.

Tôi tìm thấy một số ví dụ bằng cách sử dụng AVAudioPlayer. Nhưng tôi không thể tìm ra giải pháp để tắt các thông tin cần thiết AVPlayer.

Ai đó có thể nghĩ ra một giải pháp cho vấn đề của tôi không?

CHỈNH SỬA Tôi muốn tạo một cái gì đó như thế này (nhưng đẹp hơn)

Máy đo mức độ luồng trực tiếp AVPlayer HLS (Hiển thị dữ liệu FFT)

CHỈNH SỬA II

Một gợi ý là sử dụng MTAudioProcessingTapđể lấy dữ liệu âm thanh thô. Các ví dụ tôi có thể tìm thấy bằng cách sử dụng [[[_player currentItem] asset] tracks]mảng, trong trường hợp của tôi, là một mảng trống. Một gợi ý khác là sử dụng [[_player currentItem] audioMix]cái nulldành cho tôi.

CHỈNH SỬA III

Sau nhiều năm , dường như vẫn chưa có giải pháp. Tôi thực sự đã tiến bộ, vì vậy tôi đang chia sẻ nó.

Trong quá trình thiết lập, tôi đang thêm trình quan sát khóa-giá trị vào playerItem:

[[[self player] currentItem] addObserver:self forKeyPath:@"tracks" options:kNilOptions context:NULL];

//////////////////////////////////////////////////////

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)changecontext:(void *)context
    if ([keyPath isEqualToString:@"tracks"] && [[object tracks] count] > 0) {
        for (AVPlayerItemTrack *itemTrack in [object tracks]) {
            AVAssetTrack *track = [itemTrack assetTrack];

            if ([[track mediaType] isEqualToString:AVMediaTypeAudio]) {
                [self addAudioProcessingTap:track];
                break;
            }
        }
}

- (void)addAudioProcessingTap:(AVAssetTrack *)track {
    MTAudioProcessingTapRef tap;
    MTAudioProcessingTapCallbacks callbacks;
    callbacks.version = kMTAudioProcessingTapCallbacksVersion_0;
    callbacks.clientInfo = (__bridge void *)(self);
    callbacks.init = init;
    callbacks.prepare = prepare;
    callbacks.process = process;
    callbacks.unprepare = unprepare;
    callbacks.finalize = finalise;

    // more tap setup...

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];

    AVMutableAudioMixInputParameters *inputParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTrack];
    [inputParams setAudioTapProcessor:tap];
    [audioMix setInputParameters:@[inputParams]];

    [[[self player] currentItem] setAudioMix:audioMix];
}

Càng xa càng tốt. Tất cả điều này đều hoạt động, tôi có thể tìm đúng đường và thiết lập inputParams và audioMix, v.v. Nhưng tiếc là lệnh gọi lại duy nhất, được gọi là lệnh gọi lại init. Không ai trong số những người khác sẽ bắn vào bất kỳ thời điểm nào.

Tôi đã thử (các loại) nguồn luồng khác nhau, một trong số đó là luồng HLS chính thức của Apple: http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8

61 hữu ích 5 bình luận 3.9k xem chia sẻ
2

Đáng buồn thay, việc sử dụng luồng HLS với AVFoundationkhông cung cấp cho bạn bất kỳ quyền kiểm soát nào đối với các bản âm thanh. Tôi đã gặp phải vấn đề tương tự khi cố gắng tắt tiếng luồng HLS, điều này hóa ra là không thể.

Cách duy nhất bạn có thể đọc dữ liệu âm thanh là nhấn vào AVAudioSession.

BIÊN TẬP

Bạn có thể truy cập AVAudioSession như thế này:

[AVAudioSession sharedInstance]

Đây là tài liệu cho AVAudioSession

2 hữu ích 5 bình luận chia sẻ
1

Đo âm thanh bằng cách sử dụng có AVPlayervẻ là một vấn đề vẫn đang tiếp diễn. Điều đó đang được nói, tôi tin rằng giải pháp có thể đạt được bằng cách kết hợp AVPlayervới AVAudioRecorder.

Trong khi hai lớp có mục đích dường như trái ngược nhau, có một công việc xung quanh cho phép AVAudioRecordertruy cập AVPlayerđầu ra âm thanh của.

Máy nghe nhạc / Máy ghi âm

Như được mô tả trong Câu trả lời tràn ngăn xếp này , bạn có thể ghi lại âm thanh của AVPlayer nếu bạn truy cập vào phần thay đổi tuyến âm thanh bằng cách sử dụng kAudioSessionProperty_AudioRouteChange.

Lưu ý rằng bản ghi âm thanh phải được bắt đầu sau khi truy cập vào thay đổi tuyến âm thanh. Sử dụng câu trả lời ngăn xếp được liên kết làm tham chiếu - nó bao gồm nhiều chi tiết hơn và mã cần thiết.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~

Khi bạn có quyền truy cập vào AVPlayertuyến âm thanh của và đang ghi âm, việc đo lường tương đối đơn giản.

Mức âm thanh

Trong câu trả lời của tôi cho một câu hỏi ngăn xếp liên quan đến đo đầu vào micrô, tôi mô tả các bước cần thiết để truy cập các phép đo mức âm thanh. Việc sử dụng AVAudioRecorderđể theo dõi các thay đổi về âm lượng phức tạp hơn người ta nghĩ, vì vậy tôi đã đưa vào một dự án GitHub hoạt động như một mẫu để theo dõi các thay đổi âm thanh trong khi ghi.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Xin lưu ý ~~~~~~~~~~~~~~~~~~~~~~~ ~~~~

Sự kết hợp này trong luồng trực tiếp HLS không phải là thứ mà tôi đã thử nghiệm. Câu trả lời này hoàn toàn là lý thuyết, vì vậy có thể cần sự hiểu biết kỹ càng về cả hai lớp mới có thể hoàn thành.

1 hữu ích 2 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ ios objective-c avfoundation media-player avplayer , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading