2010-07-02 65 views
5

Tôi đã phát triển một ứng dụng Windows có thể quay video từ thiết bị bên ngoài bằng DirectShow. Độ phân giải hình ảnh là 640x480 và các video được lưu mà không nén có kích thước rất lớn (khoảng 27MB mỗi giây).Mã hóa video theo thời gian thực trong DirectShow

Mục tiêu của tôi là giảm kích thước này càng nhiều càng tốt, vì vậy tôi đang tìm một bộ mã hóa cho phép tôi nén video theo thời gian thực. Nó có thể là H.264, MPEG-2 hoặc bất cứ thứ gì khác. Nó phải cho phép tôi lưu video vào đĩa và nó sẽ là tốt nhất nếu tôi cũng có thể truyền nó trong thời gian thực qua mạng (Wi-Fi, vì vậy kích thước nên được khoảng 1MB mỗi giây, hoặc ít hơn). Việc giảm chất lượng đáng kể sẽ là không thể chấp nhận được.

Tôi đã phát hiện ra rằng việc nhận được bộ lọc DirectShow phù hợp cho nhiệm vụ này là rất khó khăn. Có thể giả định rằng máy khách là hợp lý hiện đại (CPU 2 nhân nhanh) và có thể sử dụng CUDA/OpenCL. Có một vài ứng dụng cho phép mã hóa video bằng CUDA và cung cấp hiệu suất tốt, tuy nhiên tôi chưa tìm thấy bộ lọc DirectShow thích hợp hoặc API có thể được sử dụng để phát triển một. NVIDIA nvcuvenc.dll dường như có API riêng nên tôi không thể sử dụng trực tiếp. Bất kỳ bộ mã hóa dựa trên CPU nào mà tôi đã tìm thấy đều quá chậm đối với các yêu cầu của tôi, nhưng có thể tôi đã bỏ lỡ một số.

Ai có thể giới thiệu cho tôi giải pháp, tức là bộ mã hóa (trả tiền hoặc miễn phí, có thể được sử dụng trong ứng dụng nguồn đóng) có thể đạt hiệu suất tốt, bất kể nó đang sử dụng CPU/CUDA/OpenCL hoặc DirectCompute? Hoặc có lẽ tôi nên sử dụng một số bộ mã hóa video phần cứng bên ngoài?

Trân trọng,

madbadger

+0

Không biết nếu bạn tìm thấy giải pháp cho điều này, nhưng trong khi đó tôi đã phát triển mã hóa Transport Stream cho sản phẩm của mình - có thể giải pháp như vậy bạn kể từ khi bạn đang nói về streaming qua WiFi –

Trả lời

3

Những bộ lọc có bạn đã thử?

Nếu bạn chỉ xử lý 640x480, thì bất kỳ bộ mã hóa dựa trên phần mềm thương mại chất lượng hợp lý nào cũng sẽ ổn nếu bạn chọn tốc độ bit thực tế. Không cần phải tăng tốc phần cứng bằng Cuda hoặc OpenCL. H264 mất nhiều sức ngựa hơn và đòi hỏi nhiều lõi CPU hơn, nhưng Mpeg2 hoặc bất kỳ codec nào trong số các phiên bản h263 (xvid, wmv9, divx, vv) sẽ không có vấn đề gì ngay cả trên một CPU khiêm tốn. Truyền trực tuyến qua mạng cùng một lúc sẽ tốn nhiều công sức hơn, nhưng vẫn có thể thực hiện được.

Nó không dựa trên DirectShow, nhưng VLC Media Player có thể thực hiện tất cả điều này. Nó dựa trên dự án mã nguồn mở FFMpeg. Một số phiên bản của nó được cấp phép LGPL, do đó thư viện có thể tích hợp vào dự án của bạn mà không có nhiều hạn chế.

Nếu bạn chỉ muốn một bộ bộ lọc DirectShow sẽ xử lý tất cả điều này cho bạn, tôi đã có kết quả tốt với MainConcept's sản phẩm trước đây. Họ đang ở cuối đắt tiền của quang phổ mặc dù.

+0

Cảm ơn, tôi đã đăng ký để đánh giá các SDK MainConcept. Tôi sẽ viết về kết quả sau. – madbadger

+0

Đúng như dự đoán, bộ mã hóa CUDA H.264 của MainConcept đủ nhanh và được ghi chép đầy đủ. Bởi "đủ nhanh" Tôi có nghĩa là tôi có thể đạt được mã hóa VGA 30fps thời gian thực trên một máy hiện đại trung bình mà không bị mất chất lượng nhìn thấy và các tệp kết quả nhỏ hơn 50-100 lần so với các bản gốc không nén. Nhược điểm duy nhất là giá cao của các thành phần. – madbadger

+0

Tôi đã viết các giải pháp thương mại sử dụng các bộ lọc của MainConcept. Tôi thấy rằng bộ lọc H.264 mux của họ bị rò rỉ bộ nhớ và hỗ trợ của họ là rất thiếu. Bộ lọc mã hóa và bộ giải mã của họ là tuyệt vời mặc dù. – fishfood

1

Bạn không chỉ định bộ lọc nào bạn đã thử hoặc phương pháp mất chất lượng đáng kể, vì vậy, điều tốt nhất tôi có thể làm là đề xuất một số bộ mã hóa để xem chúng có đáp ứng yêu cầu của bạn hay không.

Hai bộ lọc tốt là bộ lọc bộ mã hóa video Theora và WebM (bạn có thể lấy chúng từ một trình cài đặt đơn tại xiph.org). Cả hai bộ mã hóa chất lượng cao này đều có thể được tinh chỉnh để cân bằng hiệu suất và chất lượng. WebM có thể sử dụng nhiều bộ xử lý khi mã hóa, điều này có thể giúp ích trong trường hợp của bạn. Cả hai cũng được sử dụng w/HTML5 video, do đó có thể là một cộng thêm cho bạn.

4

Vì bạn đang sử dụng Directshow, cho đến nay việc dễ nhất là sử dụng WMV9 bên trong một vùng chứa ASF. Điều này dễ dàng hơn vì nó có sẵn trên hầu hết các máy Windows (rất ít phụ thuộc thời gian cài đặt), nhanh chóng (bạn không nên sử dụng nó trên một máy tính hợp lý hiện đại) và chất lượng là hợp lý. Nhưng xem xét giới hạn của bạn là 8 mbit/giây (1 MB/giây), chất lượng không phải là vấn đề đối với bạn. 2 mbit/giây, độ phân giải VGA WMV9 trông khá tốt.

Nó gần như không tốt bằng cách thực hiện phong nha của H264, nhưng từ quan điểm thực hiện, bạn sẽ tiết kiệm cho mình rất nhiều thời gian bằng cách đi tuyến đường này.

Xem này:

http://msdn.microsoft.com/en-us/library/dd375008%28v=VS.85%29.aspx

+0

Có vẻ khá phức tạp khi tạo cấu hình và định cấu hình ASFWriter cho codec WMV9. Đã không tìm thấy bất kỳ hướng dẫn tốt cho điều đó, hoặc chỉ là tài liệu ít hữu ích hơn của MicroSoft. – Macke

1

Quên mã hó WMV cho thời gian thực trực tuyến. WMV hoạt động tốt cho các luồng có chất lượng thấp trong thời gian thực, nhưng nó không làm mã hóa chất lượng cao trong thời gian thực.

Tôi khuyên bạn nên xem MainConcept's SDK. Họ làm một loạt các bộ lọc DirectShow để mã hóa H.264. Tôi đã thực hiện streaming thời gian thực và muxing các dòng được mã hóa trong H.264 bằng cách sử dụng các bộ lọc của MainConcept và bộ lọc DirectShow, và nó rất tuyệt.

Hope this helps

1

Tôi đang sử dụng Windows Media Encoder để mã hóa thời gian thực, và nó hoạt động tốt ngay cả ở độ phân giải 720x576. Một ví dụ như vậy về cách sử dụng của nó là trong VideoPhill Recorder.

Được viết bằng tinh khiết .NET với DirectShow.NET để chụp và windowsMedia.NET để mã hóa.

Sử dụng hai thứ đó tôi có thể đạt được mã hóa theo thời gian thực với tính ổn định 24/7.

Và cả hai thư viện đều miễn phí để sử dụng trên Windows, vì vậy bạn sẽ không phải trả bất kỳ giấy phép nào ngoại trừ OS.

1

ffdshow tryouts tận dụng công cụ x264 của ffmpeg, được cho là khá nhanh (tôi nghĩ vậy). Ngoài ra libjpeg-turbo có thể giúp, hoặc chọn một số codec khác được tạo ra cho thông lượng cao như camstudio hoặc những gì không.

update: ffmpeg có thể mất đầu vào directshow bây giờ: http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=3&t=27

0

Nếu bạn có thể ở lại bằng hoặc thấp hơn 1280x1024, Micorsofts MPEG-2 encoder (bao gồm trong Vista trở lên) là khá tốt.

Mặc dù vậy, tôi chưa làm cho nó hoạt động với nội dung 1080p. Tôi nghi ngờ các bộ mã hóa chỉ hủy bỏ về điều đó. Xấu hổ.

+0

không được hỗ trợ trên Win x64 – Ludwo

0

Xem mẫu CaptureDS C# đi kèm với AVBlocks. Nó cho thấy làm thế nào để xây dựng một máy ghi video với AVBlocks và DirectShow.DirectShow được sử dụng để quay video và AVBlocks được sử dụng để mã hóa video:

+0

Bạn có thể vui lòng đăng phần cốt lõi của mã từ liên kết không? – Lizz

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