2010-02-28 6 views
8

Tôi cần đọc luồng âm thanh được gửi bằng âm thanh flash trong ứng dụng C++ của mình (C++ không phải là giới hạn thực, có thể là C# hoặc bất kỳ ngôn ngữ nào khác trên máy tính để bàn). Ứng dụng flash ngay bây giờ sẽ gửi âm thanh đến một ứng dụng flash khác nhưng tôi cần nhận cùng một âm thanh bằng ứng dụng dành cho máy tính để bàn. Vì vậy, có cách nào tốt nhất hoặc tiêu chuẩn để thực hiện điều đó?Cách đọc bằng âm thanh C++ (C#) được gửi bằng flash?

Cảm ơn câu trả lời của bạn.

+1

Tôi có đọc bạn một cách chính xác ở chỗ bạn đang cố gắng để viết một ứng dụng mà sẽ ngăn chặn âm thanh được chuyển giao giữa hai ứng dụng đèn flash (không phải trong đó được kết nối với ứng dụng của bạn)? – bta

Trả lời

0

Bạn có thể thử sử dụng the sound system from the Gnash project.

+0

Tôi nghĩ Gnash có thể đọc đối tượng âm thanh từ tập tin swf đã lưu. Nhưng tôi cần phải nhận được một dòng âm thanh được gửi bởi plugin flash đến một plugin flash (sử dụng http hoặc những gì nó sử dụng). – Oleg

1

Âm thanh thực sự được gửi như thế nào? Qua mạng?

Chỉnh sửa: Bạn muốn ghi lại âm thanh từ luồng HTTP hoặc luồng RTMP. Chạy Wireshark để tìm hiểu, nhưng tôi nghi ngờ bạn đang làm gì đó hơi râm ...

+0

Ý tưởng ban đầu là kết nối ứng dụng flash và ứng dụng C++ và gửi âm thanh theo cả hai hướng. Nhưng có vẻ như không có cách tiêu chuẩn nào để làm điều này. Vì vậy, chúng tôi đang sử dụng phương pháp tiếp cận mới ngay bây giờ: chúng tôi sử dụng máy chủ phương tiện flash và RTMP để kết nối 2 máy khách. Cách tiếp cận này hoạt động. Nhưng một lần nữa - không có cách chuẩn nào để kết nối và phát luồng âm thanh RTMP từ máy chủ flash media nếu bạn không sử dụng flash. Hiện tôi đang làm việc. – Oleg

0

Vì vậy, về cơ bản bạn muốn kết nối với luồng âm thanh RTMP từ máy chủ phương tiện flash từ ứng dụng không flash tùy ý? Bạn đã xem http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol chưa?

+0

Chắc chắn, tôi đã thấy điều này. Về cơ bản tôi đã thực hiện thư viện C++ RTMP và có thể kết nối đến máy chủ RTMP và đọc dòng âm thanh. Tôi đã hy vọng tìm giải pháp sẵn sàng cho điều đó nhưng không tìm thấy giải pháp đã sẵn sàng. Vì vậy, tôi tự làm. – Oleg

+1

http://rtmpdump.mplayerhq.hu/ là những gì bạn muốn –

0

Thật không may, Adobe IS tương đối độc quyền (do đó cuộc chiến tranh táo-adobe xảy ra gần đây), nhưng đối với một số ngôn ngữ, có những dự án để giúp đỡ với RTMP.

WebORB là thương mại, cho .NET, Java, PHP: http://www.themidnightcoders.com/products.html

FluorineFX là mã nguồn mở cho chỉ NET: http://www.fluorinefx.com/

Tôi đã không được sử dụng cho chính mình và cho RTMP, nhưng tôi có đã sử dụng FluorineFX để kết nối với cổng chuyển tiếp flash (AMF). Tôi tưởng tượng nó có thể làm những gì bạn cần để nhận luồng âm thanh từ một ứng dụng hỗ trợ .NET.

+0

tôi đã viết client RTMP riêng của tôi trên C++. Phần RTMP dễ nhất. Sau đó, tôi gặp phải sự cố giải mã luồng âm thanh và mất quá nhiều thời gian và công sức. Dự án đã bị hủy bỏ và chúng tôi đã thực hiện nhiệm vụ bằng cách sử dụng FMS và tự flash. Điều đó dễ hơn nhiều ... – Oleg

0

Lấy khung hình, tỷ lệ khung hình và các thuộc tính khác của video clip Nếu bạn có kinh nghiệm viết ứng dụng trong Microsoft DirectShow Editing Services (tên mã Dexter), điều này nghe có vẻ rất quen thuộc với bạn. Trong môi trường Windows, việc chụp các khung vẫn được thực hiện bằng cách sử dụng C++ và Dexter Type Library để truy cập các đối tượng DirectShow COM. Để thực hiện điều này trong .NET Framework, bạn có thể tạo một Interop Assembly của DexterLib được liệt kê trong COM References trong VS 2005. Tuy nhiên, bạn cần một số lượng lớn công việc để tìm ra cách chuyển đổi mã của bạn từ C++ sang C# .NET. Sự cố xảy ra khi bạn cần chuyển tham chiếu con trỏ làm đối số cho hàm gốc, CLR không hỗ trợ trực tiếp con trỏ vì vị trí bộ nhớ có thể thay đổi sau mỗi chu kỳ thu thập rác. Bạn có thể tìm thấy nhiều bài viết về cách sử dụng DirectShow trên CodeProject hoặc những nơi khác và chúng tôi cố gắng giữ cho nó đơn giản. Ở đây, mục tiêu của chúng tôi là chuyển đổi một tập tin video thành một mảng các Bitmap và tôi cố gắng giữ nó ngắn nhất có thể, tất nhiên bạn có thể viết mã của riêng bạn để lấy Bitmaps ra khỏi luồng trực tiếp và lưu chúng ngay trước khi bạn gửi chúng .

Về cơ bản chúng ta có hai tùy chọn để sử dụng DirectShow để chuyển đổi tập tin video của chúng tôi để khung trong .NET:

Chỉnh sửa lắp ráp Interop và thay đổi tài liệu tham khảo loại từ con trỏ đến C loại # .NET. Sử dụng con trỏ với từ khóa không an toàn. Chúng tôi đã chọn phương thức không an toàn (đọc nhanh). Nó có nghĩa là chúng tôi trích xuất khung của chúng tôi bên ngoài phạm vi quản lý .NET. Điều quan trọng cần lưu ý là quản lý không phải lúc nào cũng có nghĩa là tốt hơn và không an toàn không thực sự có nghĩa là không an toàn!

MediaDetClass mediaClass = new MediaDetClass(); _AMMediaType mediaType; ... // tải tệp video int outputStreams = mediaClass.OutputStreams; outFrameRate = 0,0; cho (int i = 0; i < outputStreams; i ++) { mediaClass.CurrentStream = i; thử { // Nếu có thể nhận được tốc độ khung hình, đủ, // chúng tôi chấp nhận tệp video nếu không nó sẽ ném ngoại lệ tại đây outFrameRate = mediaClass.FrameRate; ....... // lấy các thuộc tính ở đây .....

}catch 
{ // Not a valid meddia type? go to the next outputstream } 

} // No tỷ lệ khung hình? nếu (outFrameRate == 0.0) ném NotSupportedException mới ("Chương trình không thể" + "để đọc tệp video."); // chúng tôi có tốc độ khung hình? di chuyển trên ... ... // Tạo một mảng để chứa file ảnh và intilize // đối tượng khác để lưu trữ thông tin ...

không an toàn { ... // tạo một con trỏ byte để lưu trữ các BitmapBits
... while (currentStreamPos < endPosition) { mediaClass.GetBitmapBits (currentStreamPos, BUFFERSIZE ref, ref * ptrRefFramesBuffer, outClipSize.Width, outClipSize.Height); ...
// thêm khung Bitmap đến frameArray ... }} ...

Chuyển trích xuất dữ liệu qua giao thức HTTP Cho đến nay chúng tôi đã chuyển đổi video của chúng tôi để một loạt các khung hình Bitmap. Bước tiếp theo là chuyển khung của chúng tôi qua HTTP tất cả các cách để trình duyệt của khách hàng. Sẽ tốt hơn nếu chúng ta chỉ có thể gửi bit bitmap của chúng tôi cho khách hàng nhưng chúng tôi không thể. HTTP được thiết kế để vận chuyển các ký tự văn bản có nghĩa là trình duyệt của bạn chỉ đọc các ký tự được xác định trong bộ ký tự trang HTML. Bất kỳ điều gì khác ngoài mã hóa này không thể được hiển thị trực tiếp.

Để thực hiện bước này, chúng tôi sử dụng mã hóa Base64 để chuyển đổi các ký tự Bitmap thành ASCII. Theo truyền thống, mã hóa Base64 đã được sử dụng để nhúng các đối tượng trong email. Hầu như tất cả các trình duyệt hiện đại bao gồm các trình duyệt Gecko, Opera, Safari, và dữ liệu hỗ trợ KDE (không phải IE!): Tiêu chuẩn lược đồ URI để hiển thị các hình ảnh được mã hóa Base64. Tuyệt quá! Bây giờ, chúng tôi có các khung hình của chúng tôi đã sẵn sàng để được chuyển qua HTTP.

System.IO.MemoryStream memory = new System.IO.MemoryStream(); while (currentStreamPos < endPosition) { ... // Save the Bitmpas đâu đó trong (quản lý) bộ nhớ vdeoBitmaps.Save (bộ nhớ, System.Drawing.Imaging.ImageFormat.Jpeg); // Chuyển đổi nó thành Base64 strFrameArray [frameCount] = System.Convert.ToBase64String (memory.ToArray()); // Hãy sẵn sàng cho bộ tiếp theo bộ nhớ.Seek (0, System.IO.SeekOrigin.Begin); } memory.Close(); ...

Nhưng chúng tôi không thể chỉ gửi các khung được mã hóa dưới dạng chuỗi khổng lồ. Chúng tôi tạo một tài liệu XML chứa các khung hình của chúng tôi và thông tin khác về video và sau đó gửi cho khách hàng. Bằng cách này, trình duyệt có thể nhận khung của chúng tôi dưới dạng đối tượng XML DOM và dễ dàng điều hướng qua chúng. Chỉ cần tưởng tượng cách dễ dàng là để chỉnh sửa một đoạn video được lưu trữ trong định dạng XML:

14,9850224700412 {Width = 160, Height = 120} 6,4731334 /9j/4AAQSkZJRgABAQEAYAB .... ....

Định dạng này cũng có những hạn chế riêng. Các video được chuyển đổi thành các tệp XML được mã hóa Base64 nằm trong khoảng từ 10% (chủ yếu là các tệp AVI) đến 300% trở lên (một số tệp WMV) lớn hơn tương đương nhị phân của chúng.

Nếu bạn đang sử dụng tệp XML, bạn thậm chí không cần máy chủ web, bạn có thể mở HTML từ thư mục cục bộ và nó sẽ hoạt động! Tôi đã bao gồm tệp thực thi trong tệp tải xuống của bài viết có thể chuyển đổi tệp video của bạn thành tài liệu XML mà sau này có thể được hiển thị trong trình duyệt. Tuy nhiên, việc sử dụng các tệp lớn và video có độ phân giải cao không phải là một ý tưởng hay!

OK, bây giờ chúng tôi có thể gửi tài liệu XML video mã hóa Base64 của chúng tôi như chúng tôi sẽ làm với bất kỳ loại tệp XML nào khác. Ai nói các file XML luôn luôn phải được bộ hồ sơ nhàm chán nào