2011-12-07 47 views
17

tôi chỉ viết một đoạn video đơn giản đọc ví dụ với openCV2.3.1, nhưng có vẻ như tôi không thể mở avi Video nào :(Tại sao tôi không thể mở video avi trong openCV?

VideoCapture capture("guitarplaying.avi"); 
if(!capture.isOpened()){ 
    std::cout<<"cannot read video!\n"; 
    return -1; 
} 
Mat frame; 
namedWindow("frame"); 

double rate = capture.get(CV_CAP_PROP_FPS); 
int delay = 1000/rate; 

while(true) 
{ 
    if(!capture.read(frame)){ 
     break; 
    } 
    imshow("frame",frame); 

    if(waitKey(delay)>=0) 
     break; 
} 

capture.release(); 

tôi đã thực hiện một breakpoint trong std::cout<<"cannot read video!\n" và thấy rằng nó dừng lại ở đây mỗi lần. Vì vậy, tại sao video avi không thể mở được? Cảm ơn!

+1

AVI là định dạng tệp, không phải định dạng video. Vì vậy, bạn nên kiểm tra xem video có được mã hóa ở định dạng video được hỗ trợ hay không, vì tệp AVI có thể được mã hóa theo nhiều cách khác nhau. – Macmade

Trả lời

4

1)
Hãy chắc chắn rằng các tập tin video là thực sự trong thư mục tương tự như các ứng dụng (tôi giả sử bạn đã cố gắng này), nếu không xác định tuyệt đối con đường.

2)
Nếu bạn đang ở trên Windows, bạn có thể cần một gói codec để đọc các tập tin video (ví dụ, K-Lite Codec Pack).

Như Macmade đã đề xuất, AVI chỉ đơn thuần là một vùng chứa có thể chứa các codec âm thanh, video hoặc thậm chí cả phụ đề chi tiết khác. Ngoài ra, here là FFmpeg của Zeranoe được xây dựng cho Windows. Bạn có thể nhận được thêm thông tin về nội dung codec của tập tin của bạn nếu bạn làm như sau:

ffmpeg -i guitarplaying.avi 

Bạn sẽ thấy một đầu ra trông như thế này:

ffmpeg version 0.8.7.git, Copyright (c) 2000-2011 the FFmpeg developers 
    built on Dec 6 2011 09:20:43 with gcc 4.6.1 
    configuration: --pkg-config=pkg-config --enable-gpl --enable-version3 --enable 
-nonfree --enable-runtime-cpudetect --enable-memalign-hack --enable-postproc --a 
rch=x86 --target-os=mingw32 --cross-prefix=i686-w64-mingw32- --prefix=/home/wluc 
as/ffmpeg-cross/build/deploy --enable-libx264 --enable-libvpx --enable-zlib --en 
able-bzlib --enable-libxvid --enable-libfaac --enable-libmp3lame --enable-libvor 
bis --enable-libtheora --enable-libopenjpeg --enable-libfreetype 
    libavutil 51. 30. 0/51. 30. 0 
    libavcodec 53. 40. 0/53. 40. 0 
    libavformat 53. 24. 0/53. 24. 0 
    libavdevice 53. 4. 0/53. 4. 0 
    libavfilter 2. 51. 0/2. 51. 0 
    libswscale 2. 1. 0/2. 1. 0 
    libpostproc 51. 2. 0/51. 2. 0 
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '..\..\Videos\Sintel\sintel_trailer-720p 
.mp4': 
    Metadata: 
    major_brand  : isom 
    minor_version : 512 
    compatible_brands: isomiso2avc1mp41 
    creation_time : 1970-01-01 00:00:00 
    title   : Sintel Trailer 
    artist   : Durian Open Movie Team 
    encoder   : Lavf52.62.0 
    copyright  : (c) copyright Blender Foundation | durian.blender.org 
    description  : Trailer for the Sintel open movie project 
    Duration: 00:00:52.20, start: 0.000000, bitrate: 1165 kb/s 
    Stream #0:0(und): Video: h264 (High) (avc1/0x31637661), yuv420p, 1280x720, 
1033 kb/s, 24 fps, 24 tbr, 24 tbn, 48 tbc 
    Metadata: 
     creation_time : 1970-01-01 00:00:00 
     handler_name : VideoHandler 
    Stream #0:1(und): Audio: aac (mp4a/0x6134706D), 48000 Hz, stereo, s16, 126 
kb/s 
    Metadata: 
     creation_time : 1970-01-01 00:00:00 
     handler_name : 

Vì vậy, như bạn có thể nhìn thấy chứa .mp4 này có codec video H.264 và codec âm thanh AAC.

+1

Để mở rộng ở điểm 1: mọi người thường mắc lỗi khi đặt tệp hình ảnh (avi, jpg, v.v.) vào cùng thư mục với mã nguồn thay vì cùng thư mục với chương trình đã biên dịch. – SSteve

+0

Điều này mô tả sự cố, chứ không phải giải pháp. Câu trả lời của @ nimcap giải thích cách sửa lỗi chính xác và chính xác. –

+0

Tôi sao chép opencv_ffmpeg310.dll, opencv_ffmpeg310x64.dll và sự cố đã được giải quyết. Cảm ơn bạn rất nhiều. – mesutpiskin

46

Thiếu ffmpeg.dll của OpenCV không tạo ra bất kỳ cảnh báo/lỗi nào trong OpenCV 2.3.1 và mã không thành công. Hãy chắc chắn rằng bạn có opencv_ffmpeg * .dll thích hợp trong đường dẫn của bạn.

+0

Điều này cản tôi trong một vài giờ quá, cho đến khi tôi thấy câu trả lời này –

+0

Tôi đã có vấn đề chính xác này; không có vấn đề gì encoder tôi sử dụng, nó sẽ không tải cho đến khi tôi sao chép mà DLL hơn. –

+0

Cảm ơn một tấn! Tôi đã cố gắng để sửa chữa các codec video và mã cho rendering video trên máy tính của tôi khi thực thi được tìm kiếm các ffmpeg dll. – Kartos

4

Có thể bạn nạp file.Just lib sai như tôi, tôi nhận được problem.But cùng tôi có thể mở tập tin AVI trong VC6.0 sử dụng phiên bản opencv 1.0. Nói chung, tôi thấy rằng tôi sử dụng sai lib.

Trong chế độ gỡ lỗi , nhưng tôi sử dụng opencv_core220.libopencv_highgui220.lib. Và tôi thay thế chúng bằng opencv_core220d.libopencv_highgui220d.lib .Làm cách nào để đọc.

1

Trong OpenCV 2.4.4: chỉ có opencv_ffmpeg244.dll (phát hành dll) và không opencv_ffmpeg244d.dll (debug dll)

Vì vậy, cố gắng trong chế độ biên soạn phát hành!

+1

Tôi đã gặp vấn đề về DLL bị thiếu. Phiên bản "phát hành" đang hoạt động cho tôi ở cả chế độ gỡ lỗi và chế độ phát hành. – cbuchart

1

Tôi cũng gặp phải vấn đề tương tự. Với mã mẫu cho VideoCapture, chương trình studio trực quan của tôi không thể mở bất kỳ tệp video nào. Sau đó, đề nghị của nimcap làm việc cho tôi. "Thiếu ffmpeg.dll của OpenCV không tạo ra bất kỳ cảnh báo/lỗi nào trong OpenCV 2.3.1 và mã không thành công. Hãy đảm bảo rằng bạn có opencv_ffmpeg * .dll thích hợp trong đường dẫn của mình."

Giải pháp: Sao chép opencv_ffmpeg.dll vào dự án studio hình ảnh của tôi /Debug thư mục, tôi có thể mở hầu hết mọi tệp video bằng VideoCapture.

0

Dưới Windows x64, bạn không phải đổi tên bất kỳ thứ gì. Chỉ cần đặt ... \ opencv \ build \ x64 \ vc12 \ bin vào số PATH của bạn.

0

Chỉ cần thay đổi mã của bạn từ này:

VideoCapture capture("guitarplaying.avi"); 

này:

CvCapture *input_video = cvCreateFileCapture("guitarplaying.avi"); 
-1

mở D:\OpenCV\build\x64\vc14\bin và sao chép các opencv_ffmpeg320.dll hoặc opencv_ffmpeg320_64.dll đó là có liên quan cho bạn dựa trên Windows (x86 or x64) của bạn.

opencv_ffmpeg320.dll -> cho 32-bit Windows (x86)

opencv_ffmpeg320_64.dll -> cho 64-bit Windows (x64)

Dán sao chép .dll-C:\Python27\ hoặc bất kỳ vị trí có thể truy cập từ Windows PATH biến môi trường.

Hoặc, bạn có thể tạo thư mục D:\OpenCV\vendor\ và thêm .dll tệp vào thư mục đó rồi thêm D:\OpenCV\vendor\ vào windows environment variables.

0

Tôi chỉ thêm vào điều này vì tôi đã dành nhiều thời gian hơn tôi muốn thừa nhận. Không thể mở tập tin gây ra một tấn ngoại lệ lạ.

Nếu bạn thấy rằng đường dẫn tuyệt đối hoạt động, trong khi đường dẫn tương đối không hoạt động, một điều cần kiểm tra khác là đảm bảo rằng thư mục hoạt động được đặt chính xác.

Trong Visual Studio, đây là Thuộc tính dự án (Thuộc tính cấu hình) -> Gỡ lỗi -> Thư mục làm việc. Tôi tìm thấy tôi đặt thành "$ (ProjectDir)" theo mặc định khi tôi thực sự muốn "$ (OutDir)".

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