2012-09-16 67 views
5

Cảm ơn bạn đã dành chút thời gian để đọc câu hỏi của tôi.Tệp âm thanh thô thành AAC bằng cách sử dụng Windows Media Foundation trên Windows 7

Tôi đang phát triển ứng dụng C++ bằng Qt và API cửa sổ.

Tôi đang ghi lại đầu ra micrô trong các tệp âm thanh 10 giây ở định dạng thô và tôi muốn chuyển đổi chúng sang định dạng aac.

Tôi đã cố đọc nhiều thứ nhất có thể và nghĩ rằng bắt đầu từ API chuyển mã nền tảng phương tiện truyền thông là một ý tưởng tuyệt vời.

Vấn đề là, tôi dường như không thể sử dụng tệp .raw hoặc .pcm trong hàm "CreateObjectFromUrl" và vì vậy, tôi bị kẹt ở đây rất nhiều lúc này. Nó tiếp tục thất bại. Mã trả về hr bằng 3222091460. Tôi đã cố gắng chuyển một tệp .mp3 sang hàm và tất nhiên nó hoạt động, vì vậy không có liên kết url-con người nào tham gia.

MF_OBJECT_TYPE ObjectType = MF_OBJECT_INVALID; 

IMFSourceResolver* pSourceResolver = NULL; 
IUnknown* pUnkSource = NULL; 

// Create the source resolver. 
hr = MFCreateSourceResolver(&pSourceResolver); 
if (FAILED(hr)) 
{ 
    qDebug() << "Failed !"; 
} 


// Use the source resolver to create the media source. 


hr = pSourceResolver->CreateObjectFromURL(
     sURL,      // URL of the source. 
     MF_RESOLUTION_MEDIASOURCE, // Create a source object. 
     NULL,      // Optional property store. 
     &ObjectType,    // Receives the created object type. 
     &pUnkSource     // Receives a pointer to the media source. 
     ); 

Các MFCreateSourceResolver hoạt động tốt, nhưng CreateObjectFromURL không thành công :(

Vì vậy, tôi có hai câu hỏi cho bạn folks:

  1. Có thể mã hóa các file âm thanh thô vào tệp aac sử dụng
  2. Nếu có, tôi nên đọc gì để hoàn thành những gì tôi muốn?

Tôi muốn chỉ ra rằng tôi không thể chỉ sử dụng ffmpeg hoặc libav vì tôi không đủ khả năng cho bất kỳ giấy phép nào cho phần mềm của mình và không muốn nó nằm trong giấy phép GPL. Nhưng nếu có các lựa chọn thay thế cho nền tảng phương tiện truyền thông để mã hóa các tệp âm thanh thô thành aac, tôi sẽ rất vui khi nghe chúng.

Và cuối cùng, xin lỗi vì tiếng anh xấu của tôi, điều này rõ ràng không phải là ngôn ngữ mẹ đẻ của tôi và tôi xin lỗi nếu tôi làm mắt bạn chảy máu. (Và hạnh phúc nếu tôi làm bạn cười)

Have a nice day

Trả lời

3

Mã hr trở lại bằng 3222091460

Đó là HRESULT mã. Sử dụng this "ShowHresult" tool để chúng được giải mã một cách thuận tiện cho bạn. Mã có nghĩa là 0xC00D36C4MF_E_UNSUPPORTED_BYTESTREAM_TYPE "Loại luồng byte của URL đã cho không được hỗ trợ."

Vấn đề về cơ bản là không có hỗ trợ cho các tệp thô này .WAV là nguồn tốt cho âm thanh thô - tệp chứa cả bộ mô tả định dạng và tải trọng.

Bạn rõ ràng có thể đọc dữ liệu từ chính tệp âm thanh thô và nén thành AAC bằng cách sử dụng giao diện AAC Encoder của Media Foundation qua giao diện IMFTransform. Điều này là hợp lý dễ dàng và bạn có dữ liệu AAC về đầu ra, ví dụ: viết vào raw .AAC.

Tùy chọn thay thế cho Media Foundation là DirectShow (có codec phù hợp, mặc dù tôi nghĩ rằng nó có thể không dễ dàng để bắt đầu), libfaac, FFmpeg libavcodec (có sẵn dưới LGPL, chứ không phải GPL).

+1

Xin chào La Mã và cảm ơn bạn rất nhiều vì câu trả lời của bạn. Nó làm mọi thứ rất rõ ràng, và tôi không thể cảm ơn đủ cho thời gian của bạn. Tôi sẽ đi với AAC Encoder từ WMF để có được AAC thô và xem những gì tôi có thể làm từ đó. Nếu tôi có thể hỏi bạn 2 phút nữa về kiến ​​thức của bạn, vì tôi khá nhiều người mới bắt đầu trong việc mã hóa âm thanh ... Tôi dường như không tìm thấy bất kỳ ví dụ mã nào để giúp tôi thực hiện các bước nào để chuyển đổi pcm thành aac. Khi tôi hiểu nó bây giờ nhờ bạn, tôi cần phải tạo một giao diện IMFTransform, thiết lập đầu vào raw và output aac, thiết lập thời lượng mẫu và gọi ProcessOutput. Nó đơn giản sao? –

+1

Rất tiếc, tôi không biết mã mẫu tham khảo tốt. Tuy nhiên, trước đây tôi từng làm việc đó một thời gian, vì vậy tôi biết nó hoạt động tốt. Có những gì bạn về cơ bản cần là làm theo [AAC Encoder] (http://msdn.microsoft.com/library/dd742785%28v=vs.85%29.aspx) và khởi tạo lớp MFT, thiết lập kiểu phương tiện đầu vào, thiết lập đầu ra loại phương tiện (cẩn thận!), sau đó đẩy dữ liệu PCM bằng 'ProcessInput' và kéo dữ liệu AAC bằng' ProcessOutput'. –

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