2011-12-21 29 views
6

Tôi cố gắng tạo phim bằng cách lặp qua các khung trong MATLAB.Các sự cố khi tạo tệp phim trong MATLAB

Tham khảo tài liệu mathworks.com tại http://www.mathworks.com/help/techdoc/ref/movie.html, tôi đã quản lý để tạo hiệu ứng cho một âm mưu. Tuy nhiên, vấn đề phát sinh khi tôi cố gắng lưu phim trong một tập tin avi.

Cả hai phương pháp avifileVideoWriter từ https://stackoverflow.com/a/8038540/818608, dẫn đến các lỗi tương tự.

Mặc dù hoạt ảnh hoạt động tốt, phim đã lưu chỉ bao gồm một khung cố định và đôi khi, ảnh chụp màn hình bao gồm lớp phủ của trình duyệt web nền của tôi.

Cảm ơn bạn trước.

Dưới đây là mã tôi đã sử dụng và khung được đông lạnh trên avi được liên kết bên dưới.

Z = peaks; surf(Z); 
axis tight 
set(gca,'nextplot','replacechildren'); 

vid = VideoWriter('myPeaks2.avi'); 
vid.Quality = 100; 
vid.FrameRate = 15; 
open(vid); 
for k = 1:20 
    surf(sin(2*pi*k/20)*Z,Z) 
    writeVideo(vid, getframe(gcf)); 
end 
close(vid); 

winopen('myPeaks2.avi') 

The frame that's frozen on the avi is linked below

+2

Bạn có thể cung cấp cho chúng tôi một đoạn mã bạn đang sử dụng để tạo phim hay thậm chí tốt hơn không, ví dụ làm việc nhỏ? Bạn đang gặp lỗi gì? –

+0

Tôi đã cập nhật bài đăng của mình để bao gồm mã được sử dụng. Hoạt ảnh chạy qua vòng lặp 'for' và tôi thấy tất cả các khung. Tuy nhiên, khi tôi mở avi đã lưu, tôi chỉ thấy một khung cố định toàn bộ thời gian và tôi đã bao gồm ảnh chụp màn hình của khung ở trên. – flamearchon

Trả lời

3

Hãy thử như sau:

f = figure(); 
    Z = peaks; surf(Z); 
    a = axes('Parent',f); 
    axis(a,'tight'); 
    set(a,'nextplot','replacechildren'); 
    vid = VideoWriter('myPeaks2.avi'); 
    vid.Quality = 100; 
    vid.FrameRate = 15; 
    open(vid); 
    for k = 1:20 
     surf(a,sin(2*pi*k/20)*Z,Z) 
     writeVideo(vid, getframe(f)); 
    end 
    close(vid); 

    winopen('myPeaks2.avi') 

Nó chứa xử lý rõ ràng sử dụng thay vì tiềm ẩn. Nhiều sự hỗn loạn được gây ra trong Matlab bởi vì mọi người có khuynh hướng sử dụng những cái tiềm ẩn, như "gcf", "gca" nên được loại bỏ hoàn toàn khỏi ngôn ngữ, IMHO.

+2

Khi tôi chạy mã của bạn, tôi không thấy một âm mưu. Hình này trống. – flamearchon

3

này hoạt động hoàn hảo cho tôi.

Điều gì sẽ xảy ra nếu bạn thử đặt số drawnow trong vòng lặp sau surf? (Điều này xóa tất cả các sự kiện và cập nhật hình đồ họa của bạn).

Có thể đó là trình phát phim hoặc codec của bạn? Bạn có thể thử VLC/Windows Media Player/etc etc?

0

tôi quản lý để làm cho nó hoạt động bằng cách buộc các khung hình là vô hình, theo http://www.mathworks.com/support/tech-notes/1200/1204.html:

aviobj=avifile('test.avi'); %creates AVI file, test.avi 
hf= figure('visible','off'); %turns visibility of figure off 
hax=axes; 

for k=1:10 
    image(k.*peaks,'parent',hax); %puts image in invisible axes 
    set(gca,'Zlim',[-20 20]); 
    aviobj=addframe(aviobj,hf); %adds frames to the AVI file 
end 

aviobj=close(aviobj); %closes the AVI file 
close(hf); %closes the handle to invisible figure 

Vào cuối ngày, không nén được sử dụng, như tôi không có Indeo5 . Có đúng là để nói rằng chúng ta có thể loại trừ nén như là vấn đề?

8

Tôi có vấn đề này (tốt, liên quan chặt chẽ) ngày hôm nay. Chủ đề stackoverflow này là một trong những kết quả công cụ tìm kiếm hàng đầu, vì vậy tôi nghĩ tôi sẽ cung cấp cho người tìm kiếm trong tương lai một số thông tin thêm.

Tôi đang sử dụng đối tượng VideoWriter và gọi frame=getframe(fig_handle) để lưu từng khung hình vào video. Như trong câu hỏi cho chủ đề này, chỉ có 1 khung được lưu. Ngoài ra, nền phía sau hình có thể được nhìn xuyên qua nó, như thể hình minh bạch một phần.

Thay đổi hiển thị cho họa sĩ hoặc bộ tạo hình chữ nhật. (Ví dụ: set(gcf,'renderer','zbuffer').)

Tôi cần hiển thị OpenGL vì phim đã sử dụng độ trong suốt. Chìa khóa để thực hiện công việc này là sử dụng

opengl('software') 

Điều này có thể là vấn đề khi gửi đồ họa đến và từ card màn hình (Tôi không chắc chắn ... nó hoạt động và tôi đã chuyển trên).

+2

+1 chỉ cần chạy vào ngày hôm nay trên cài đặt Win8 của tôi. Điều này đã không xảy ra trên máy WinXP cũ của tôi (tôi đã cố tạo một tệp [animated GIF] (http://stackoverflow.com/a/11054155/97160) bằng cách sử dụng 'getframe' trong một vòng lặp). Một giải pháp khác là sử dụng ['hardcopy'] không có giấy tờ (http://stackoverflow.com/a/13078532/97160) – Amro

+3

Đây phải là câu trả lời được chấp nhận. Để tóm tắt, trong câu trả lời [@ Andrey] (http://stackoverflow.com/a/8619687/866007), thay thế 'f = figure();' bằng 'f = figure ('renderer', 'zbuffer');' . –

0

Bạn đã thử thay đổi cài đặt màn hình của mình thành màu 16 bit chưa? http://www.mathworks.com/matlabcentral/newsreader/view_thread/257389

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – NAZIK

+0

Liên kết chỉ cho thấy rằng giải pháp - thay đổi cài đặt màn hình của bạn thành màu 16 bit - đã được hiển thị để hoạt động trong quá khứ và đã được ghi lại trên matlabcentral trong vài năm cũng như được cập nhật gần đây. – user2145660

0

Tôi cũng gặp sự cố chỉ có một khung được lưu trữ hôm nay. Thay đổi tốc độ khung hình từ:

vid.FrameRate = round(0.2*fps/beatfreq); 

mà đánh giá đến 3, chỉ đơn giản là:

vid.FrameRate = 10; 

Tôi không thể hiểu tại sao điều này sẽ làm cho bất kỳ sự khác biệt, nhưng nó đã nhanh chóng làm việc sau khi thay đổi này.

EDIT: Hóa ra là VLC không thể xử lý các khung hình rất thấp. Windows Media Player chơi nó không có mồ hôi.

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