2012-08-02 24 views
6

Tôi có một chương trình sử dụng đơn vị âm thanh của trình phát tệp để phát, tạm dừng và dừng tệp âm thanh. Cách tôi thực hiện điều này là bằng cách khởi tạo đơn vị âm thanh của trình phát tệp để phát tệp ở vị trí 0 và sau đó khi người dùng nhấn nút tạm dừng, tôi dừng biểu đồ AUGraph, nắm bắt vị trí hiện tại và sau đó sử dụng vị trí đó làm vị trí bắt đầu khi người dùng nhấn nút phát. Mọi thứ đều hoạt động tốt, nhưng cứ 3 hoặc 4 lần tôi lại dừng lại và sau đó chơi, bài hát bắt đầu chơi một nửa đến một giây đầy TRƯỚC KHI điểm tôi dừng lại.Trong âm thanh lõi IOS, làm cách nào để bạn tìm thấy vị trí đầu phát hiện tại thực của một đơn vị âm thanh của trình phát tệp?

Tôi không thể hiểu tại sao điều này xảy ra, bạn có nghĩ gì không? đây là một phiên bản đơn giản của mã của tôi.

//initialize AUGraph and File player Audio unit 
... 
... 
... 

//Start AUGraph 
... 
... 
... 

// pause playback 
- (void) pauseAUGraph { 

//first stop the AuGrpah 
     result = AUGraphStop (processingGraph); 

// get current play head position   
     AudioTimeStamp ts; 
     UInt32 size = sizeof(ts); 

     result = AudioUnitGetProperty(filePlayerUnit, 
             kAudioUnitProperty_CurrentPlayTime, kAudioUnitScope_Global, 0, &ts, 
             &size); 
     //save our play head position for use later 
     //must add it to itself to take care of multiple presses of the pause button 
     sampleFrameSavedPosition = sampleFrameSavedPosition + ts.mSampleTime; 


     //this stops the file player unit from playing 
     AudioUnitReset(filePlayerUnit, kAudioUnitScope_Global, 0); 
     NSLog (@"AudioUnitReset - stopped file player from playing"); 

    //all done  
} 


// Stop playback 

- (void) stopAUGraph { 
     // lets set the play head to zero, so that when we restart, we restart at the beginning of the file. 

      sampleFrameSavedPosition = 0; 
     //ok now that we saved the current pleayhead position, lets stop the AUGraph 
     result = AUGraphStop (processingGraph); 
} 
+0

Định dạng tệp âm thanh là gì? –

+0

chúng là các tệp m4a. – Beleg

+0

OK, tôi không phải là chuyên gia về nén âm thanh, nhưng các tệp có xu hướng được nén theo khối và khi bạn tìm kiếm nó có thể đi tới đoạn gần nhất chứ không phải vị trí thực tế. Nếu tôi đi qua bất cứ điều gì dứt khoát hơn tôi sẽ gửi một câu trả lời. –

Trả lời

0

Nó có thể là do làm tròn các vấn đề với mã của bạn:

Ví dụ, nếu mỗi khi bạn nhấn nút tạm dừng, hẹn giờ của bạn sẽ ghi lại tại một 0.5/4 giây trước khi thời gian tạm dừng thực tế của bạn, bạn vẫn sẽ thấy kết quả mong muốn. Nhưng sau khi lặp lại bốn lần nữa, lượng không gian bạn đã tạo là 0,5/4 lần 4, đó là nửa giây bạn dường như đang trải qua.

Vì vậy, tôi sẽ chú ý cẩn thận đến các loại đối tượng bạn đang sử dụng và đảm bảo chúng không tròn không thích hợp. Hãy thử sử dụng một số double float cho các lần mẫu của bạn để cố gắng giảm bớt vấn đề đó!

Hy vọng điều này rõ ràng và hữu ích! :)

+0

Tôi đang sử dụng float64 để lưu trữ audioTimeStamp.mSampletime vào sampleFrameSavedPosition để không có bất kỳ lỗi làm tròn nào. Tôi đã nhận thấy rằng khi tôi khởi động AuGraph trở lại bằng cách thiết lập ScheduledAudioFileRegion.mStartFrame rằng ScheduledAudioFileRegion.mStartFrame là một UInt32 và không phải là float64, được nói khi tôi kiểm tra chương trình của tôi và in các giá trị của mSampleTime luôn luôn là một số nguyên nên không nên mater. – Beleg

+0

Sau đó, về lý thuyết, nếu tất cả các loại của bạn là số nguyên, nó thậm chí không nên xuất ra một phần nhỏ. Bạn đã cố gắng để đầu ra vị trí đầu mỗi lần và xem nếu nó được thêm vào? – wayway

1

Có thể bạn nên sử dụng số lượng gói thay vì dấu thời gian vì bạn chỉ muốn tạm dừng và phát nhạc chứ không hiển thị thông tin thời gian.

Xem BufferedAudioPlayer để biết ví dụ về cách sử dụng phương pháp này.

+0

Vì vậy, bạn đang đề nghị sử dụng một rendercallback thay vì một tập tin đơn vị âm thanh Player và đếm các gói thay vì sử dụng dấu thời gian? Tôi sẽ cố gắng tối nay. – Beleg

+0

Có. Tôi đã sử dụng thành công trong nhiều dự án. Audiograph (https://github.com/tkzic/audiograph) là một ví dụ khác có cách tiếp cận tương tự. Dự án đó cũng có một sổ tay rất tốt. – Totoro