2015-02-12 19 views
5

Sử dụng trình bao bọc AFF ffmpeg, bạn có thể trích xuất khung từ video bằng cách sử dụng lớp VideoFileReader và lưu nó dưới dạng bitmap.Trích xuất khung hình C# từ một phần của tệp video

Xem này cho dụ: Extracting frames of a .avi file

Vấn đề của tôi với điều đó là bạn không thể xác định nơi để bắt đầu đọc các khung. Nó luôn bắt đầu từ đầu tệp video.

Nhưng điều gì sẽ xảy ra nếu tôi muốn trích xuất các khung đang ở giữa tệp video dài hai giờ. Sử dụng lớp đó bạn sẽ phải phân tích cú pháp toàn bộ giờ đầu tiên để đi đến những khung hình đó.

Có ai biết cách để đạt được điều đó không?

+0

Dường như chúng không cung cấp cách để thực hiện điều đó. Bạn có thể cố gắng gian lận bằng cách cắt tệp bằng một thư viện khác hoặc chỉ sử dụng một thư viện khác để trích xuất khung hình để bắt đầu. EDIT: Bạn hoàn toàn có thể gỡ lỗi và xem các thành viên riêng tư của cá thể 'VideoFileReader' và xem liệu có thể Reflection có thể giúp bạn ở đây không. – SimpleVar

+0

Trông giống như một câu trả lời hay cho tôi, nó có phù hợp với bạn không? –

Trả lời

4

Nếu bạn biết vị trí trong video bạn muốn bắt đầu đọc, chỉ cần bỏ qua số lượng khung hình phù hợp; không cần phải xử lý chúng. Giả sử, tất nhiên, bạn biết số khung chính xác mà bạn muốn bắt đầu đọc từ đó, bạn có thể tính toán bằng cách nhân tốc độ khung hình với thời gian bạn muốn thực hiện trích xuất. Trong ví dụ của bạn, nếu video dài hai tiếng đồng hồ và bạn muốn trích xuất khung hình từ giữa ...

VideoFileReader reader = new VideoFileReader(); 
reader.Open("file.avi"); 

// Jump to 1 hour into the video 
int framesToSkip = reader.FrameRate * 3600; // 1 hour = 3600 seconds 
for (int i = 0; i < framesToSkip; i++) 
    reader.ReadVideoFrame(); 

// Now the next time ReadVideoFrame() is called, we will get the frame at the 1 hour mark 

này giả định rằng các .FrameRate tài sản trả về giá trị trong khung hình mỗi giây. Thật không may là documentation không nói, vì vậy tôi không chắc chắn cách xử lý các tệp video với các khung hình không tách rời (tức là 29.97 là tốc độ khung hình chung.)

+0

Điều này không may dường như hiện tại là cách duy nhất với trình bao bọc AForge/Accord. Tôi sẽ thêm nếu bạn sử dụng phương pháp này để vứt bỏ từng khung hình mà bạn đang ném đi, '' videoFrame.Dispose() '' (trong vòng lặp bỏ qua) nếu không bạn sẽ gặp lỗi sau khoảng 1k khung. –

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