2016-04-13 32 views
10

Tôi đang quay video bằng FFmpeg và tôi muốn tốc độ khung hình được viết bằng ít nhất là ở ballpark bên phải. Ngay bây giờ tôi lấy tỷ lệ khung hình mà đầu vào của tôi tuyên bố là có và sử dụng nó để đặt tốc độ khung hình (time_base) cho luồng video đầu ra của tôi. Tuy nhiên, điều này đôi khi rất khác so với tốc độ khung hình thực tế mà tôi nhận được (tôi đã thấy luồng xác nhận 50 khung hình/giây nhưng xuất bản ở tốc độ 9 khung hình/giây).Quay video với tốc độ khung hình không xác định bằng FFmpeg

Điều tôi muốn làm là sử dụng bộ hẹn giờ đã trôi qua và đếm các khung hình tôi ghi để tính tỷ lệ khung hình thực tế tôi đã ghi lại khi tôi ghi xong. Tôi có vẻ mặc dù tốc độ khung hình được đặt trong AVStream của tôi được sử dụng trong avcodec_open2 trước khi tôi viết bất kỳ khung hình nào. Nếu tôi đặt nó sau (như trong khi tôi đang viết khung) trong khi ffplay có thể chơi nó (phàn nàn rằng các bit tăng thời gian là 6 không 4) người chơi video khác không thể. Có cách nào để đặt tốc độ khung hình cho toàn bộ tệp sau khi viết khung không? Nếu không phải là có một cách để nói cho các khung hình chính mình một số loại dấu thời gian hoặc tỷ lệ khung hình trong khi tôi đang ghi âm sẽ dẫn đến một tập tin ghi lại hợp lệ?

+0

hi, tôi sẽ xem xét nhiều hơn, nhưng chỉ muốn hỏi về avconv. tìm thấy nó sau khi tìm kiếm google nhanh chóng, có vẻ như nó có thể thay đổi tốc độ khung hình của một tệp. có lẽ bạn có thể viết các tập tin ở một tỷ lệ khung hình tùy ý và sau đó sau khi phát hiện tỷ lệ thực tế, kết thúc bằng văn bản và chạy avconv với tỷ lệ mới? chỉ là một suy nghĩ, không phải là một câu trả lời thực sự;) sẽ tiếp tục tìm kiếm mặc dù. cho tôi biết. – nephi12

+0

avconv là tên nhị phân cho dự án libav. (http://superuser.com/questions/507386/why-would-i-choose-libav-over-ffmpeg-or-is-there-even-a-difference) có một bản tóm tắt khá tốt về tất cả các tên đã có tôi bối rối trong một thời gian. Bất cứ điều gì avconv không nên có thể với các thư viện nó sử dụng. – Chris

Trả lời

0

Bí quyết có vẻ là sử dụng AVCodecContext time_baseAVFrame pts theo cách thông minh hơn tôi. Nếu bạn đang ghi với tốc độ khung hình cố định thì time_base được đặt thành 1/tốc độ khung hình và pts chỉ là số tăng cho khung được ghi. Thay vào đó bây giờ tôi bắt đầu một bộ đếm thời gian trôi qua khi tôi bắt đầu ghi âm và đặt time_base thành 1 trên mức độ chi tiết của bộ hẹn giờ (trong trường hợp của tôi có độ chính xác đến một phần nghìn giây đến 1000). Tôi đặt khung hình thành số lượng thời gian trôi qua trước khi được mã hóa. Kết hợp này dẫn đến một tệp video có tốc độ khung hình biến đổi phát lại chính xác.

0

Chris. Bạn cần phát triển công cụ ghi luồng video mới. Vì vậy, nếu bạn đặt tốc độ khung hình là [N], công cụ viết sẽ viết khung theo tỷ lệ.

  • Kiểm tra Timestamp cho mỗi khung Khi Viết
  • Nếu bạn có khung hình ít hơn N cho một thứ hai, bạn cần phải thực hiện khung trùng lặp.
  • Nếu bạn có nhiều khung hình hơn N trong một giây, bạn cần phải thả một số khung.

Trước khi viết, bạn cần chỉ định tốc độ khung hình chính xác.

Và công cụ ghi tệp video của bạn phải hoạt động với tốc độ khung hình được chỉ định.

Bạn có thể thực hiện việc này bằng cách sử dụng ffmpeg.

+0

Điều này có vẻ như là tốt nhất bạn có thể làm với một tỷ lệ khung hình biến nhưng những gì nếu nó đã được cố định và chưa biết? Trong trường hợp tôi trình bày các dòng tuyên bố 50 khung hình/giây nhưng thực sự là 9 vì vậy trong khi cách tiếp cận của bạn sẽ làm việc tôi sẽ ghi âm hơn 5 lần khung hơn tôi sẽ cần. Về cơ bản điều này để làm việc tốt vẫn yêu cầu bạn biết tốc độ khung hình trước khi bạn bắt đầu. – Chris

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