Tôi đang cố gắng sử dụng ffmpeg để chụp khung hình từ một tệp video, nhưng tôi thậm chí không thể nhận được thời lượng của video. Mỗi khi tôi cố gắng truy cập nó với pFormatCtx->duration
Tôi nhận được 0. Tôi biết con trỏ được khởi tạo và chứa thời lượng chính xác vì nếu tôi sử dụng av_dump_format(pFormatCtx, 0, videoName, 0);
thì tôi thực sự nhận được dữ liệu thời lượng cùng với thông tin khác về video. Đây là những gì tôi nhận được khi tôi sử dụng av_dump_format(pFormatCtx, 0, videoName, 0);
:FFMPEG không thể hiển thị thời lượng của video
Input # 0, avi, từ 'futurama.avi':
Thời gian: 00: 21: 36,28, hãy bắt đầu: 0,000000, bitrate: 1135 kb/s
Suối # 0.0: video: mpeg4 (Advanced Simple Profile), yuv420p, 512x384
[PAR 1: 1 DAR 4: 3], 25 TBR, 25 TBN, 25 tbc
Suối # 0.1: Âm thanh: ac3, 48000 Hz, âm thanh nổi, s16, 192 kb/s
Tôi không hiểu tại sao av_dum_format
có thể hiển thị thời lượng và tôi không thể. Tôi đã kiểm tra định nghĩa hàm, để hiển thị thời lượng, hàm cũng sử dụng thời gian pFormatCtx->. Nó không chỉ là thời gian biến thành viên khác cũng không hiển thị dữ liệu thích hợp khi tôi gọi cho họ trong main.cpp
Dưới đây là main.cpp tôi:
extern "C" {
#include<libavcodec/avcodec.h>
#include<libavformat/avformat.h>
#include<libswscale/swscale.h>
}
int main(int argc, char *argv[]) {
AVFormatContext *pFormatCtx = NULL;
const char videoName[] = "futurama.avi";
// Register all formats and codecs.
av_register_all();
cout << "Opening the video file";
// Open video file
int ret = avformat_open_input(&pFormatCtx, videoName, NULL, NULL) != 0;
if (ret != 0) {
cout << "Couldn't open the video file." << ret ;
return -1;
}
if(avformat_find_stream_info(pFormatCtx, 0) < 0) {
cout << "problem with stream info";
return -1;
}
av_dump_format(pFormatCtx, 0, videoName, 0);
cout << pFormatCtx->bit_rate << endl; // different value each time, not initialized properly.
cout << pFormatCtx->duration << endl; // 0
return 0;
}
Tôi không biết nếu nó giúp nhưng , Tôi sử dụng QtCreator trên Ubuntu và liên kết các thư viện tĩnh.
Cảm ơn sự giúp đỡ của bạn.
Có một cái gì đó mà 'av_dump_format' làm trước khi nó đọc 'pFormatCtv-> duration' mà làm cho lĩnh vực này có hiệu lực. Nói cách khác, có mã bổ sung phải được thực thi trước khi thời hạn trở thành hợp lệ. Theo dõi một số mã hoạt động và bạn sẽ tìm thấy phần còn thiếu. BTW, bạn vẫn quan tâm đến một câu trả lời cho điều này? –
Tôi đã cố gắng sử dụng các tính năng của ffmpeg trên dự án cá nhân của tôi nhưng tôi đã kết thúc bằng cách sử dụng các quy trình mới với ffmpeg.exe. Tôi muốn tìm ra câu trả lời, ffmpeg là một công cụ rất mạnh, tôi chắc chắn tôi sẽ sử dụng nó trong tương lai và sẽ hiệu quả hơn nhiều nếu tôi biết cách sử dụng thư viện thay vì sử dụng tệp thực thi trong các quy trình mới. – Malkavian
Tôi có thể sẽ không thể thử phương pháp của bạn bất cứ lúc nào sớm, tôi khá bận rộn những ngày này, tôi cho bạn phiếu bầu, tôi sẽ cho bạn biết nếu nó hoạt động. Cảm ơn một lần nữa! – Malkavian