2010-11-03 28 views
6

Gần đây tôi đã cố gắng để nâng cấp các thư viện ffmpeg tôi sử dụng trong ứng dụng Mac OS X của tôi bằng cách tải về và biên dịch ffmpeg từ nguồn.ffmpeg biên dịch vấn đề: avcodec_find_decoder luôn luôn trả về null

Mã của tôi hoạt động đúng với thư viện được biên dịch trước của cùng một phiên bản trên cửa sổ. Trên Mac OS X, thư viện có vẻ hoạt động (nó có thể mở tệp và tìm các luồng và codec được sử dụng), nhưng khi nó được chuyển tới avcodec_find_decoder, hàm này luôn trả về giá trị rỗng.

Mã này đã làm việc với một phiên bản cũ của thư viện (biên soạn một năm trước trên Mac OS X 10.5)

tôi cấu hình fmpeg sử dụng

./configure --extra-cflags="-arch i386" --extra-ldflags='-arch i386' --arch=x86_32 --target-os=darwin --enable-cross-compile --disable-indev=jack --enable-shared --disable-static 

Tôi đã kiểm tra config.mak, và nó xuất hiện để có bộ giải mã cho các loại tập tin tôi đã thử bật (ogg, vorbis, avi, mkv, ...) Tôi cũng đã kiểm tra xem các tập tin tiêu đề chính xác đã được sử dụng chưa và thư viện mới được biên dịch đã được sử dụng chưa.

Tôi đã tìm thấy chỉ có một số bài viết cũ liên quan đến vấn đề này, nhưng không có bất kỳ giải pháp:

http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/2007-January/021399.html

http://libav-users.943685.n4.nabble.com/avcodec-find-decoder-problem-td944800.html

Chỉnh sửa: kiểm tra hơn nữa, nó xuất hiện av_codec_next (NULL) trả về null cũng , có nghĩa là không có một codec duy nhất có sẵn, hoặc rằng first_avcodec trong utils.c không được thiết lập (tôi thực sự đã không tìm thấy ở tất cả các nơi mà biến này được thiết lập, tôi đã giả định av_register_all, nhưng tôi không thể tìm thấy nó đó)

Trả lời

7

Tôi đã tìm ra giải pháp cho vấn đề của mình, mặc dù tôi vẫn sẽ quan tâm nếu có ai có thể giúp tôi giải thích về vấn đề của mình.

Về cơ bản, tôi chỉ gọi av_register_all() ở đầu chức năng của mình. Bây giờ khi thêm avcodec_register_all() sau này, mã của tôi hoạt động trở lại. Tôi không hiểu tại sao mặc dù, vì avcodec_register_all() nên được gọi bởi av_register_all() từ nhìn vào mã nguồn.

Xem http://www.ffmpeg.org/doxygen/trunk/allformats_8c-source.html#l00039 cho mã nguồn

0

trong av_register_all():

static int initialized; 
if (initialized) 
    return; 
initialized = 1; 
avcodec_register_all(); 

Có lẽ do một số yếu tố được chú ý, các tĩnh int biến "khởi tạo" đã được khởi tạo trong khi avcodec chưa được đăng ký ... Sau đó chúng ta nên gọi avcodec_register_all() để thực hiện nó một cách rõ ràng. Nhưng tôi có khuynh hướng nghĩ rằng đó là một lỗi trong ffmpeg.

+0

Điều đó thực sự trông giống như một lỗi. Tôi không nghĩ rằng các tiêu chuẩn c đảm bảo rằng khởi tạo sẽ là 0? Vì vậy, static int initialized = 0; sẽ là cách chính xác để thực hiện. – Adion

+0

@Adion Có, tiêu chuẩn C không khởi tạo biến int tĩnh thành số không nếu chúng không được khởi tạo một cách rõ ràng. Tuy nhiên, [ở đây] (http://stackoverflow.com/questions/1294772/does-gcc-automatically-initialize-static-variables-to-zero) nói thêm ... – Daniel

+0

Ok, tôi thực sự không còn gọi avcodec_register_all nữa(), do đó, bất cứ điều gì đã sai dường như đã được cố định trong 5 năm kể từ khi tôi hỏi câu hỏi. – Adion

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