2013-09-27 204 views
5

Tôi đang làm việc trên trình bao bọc API libavformat chuyển đổi tệp MP4 có phân đoạn H.264 và AAC sang MPEG-TS phù hợp để phát trực tuyến. Tôi chỉ đang thực hiện một bản sao luồng đơn giản mà không cần mã hóa lại, nhưng các tệp tôi tạo phát lại video tại 3600 fps thay vì 24 khung hình/giây.Các tệp được tạo bằng bản sao luồng trực tiếp bằng cách sử dụng API libavformat của FFmpeg phát lại quá nhanh tại 3600 fps

Dưới đây là một số kết quả đầu ra từ ffprobe https://gist.github.com/chrisballinger/6733678, các tập tin bị hỏng ở dưới:

r_frame_rate=1/1 
avg_frame_rate=0/0 
time_base=1/90000 
start_pts=0 
start_time=0.000000 
duration_ts=2999 
duration=0.033322 

Các tập tin đầu vào tương tự bằng tay gửi qua ffmpeg có thông tin timestamp thích hợp:

r_frame_rate=24/1 
avg_frame_rate=0/0 
time_base=1/90000 
start_pts=126000 
start_time=1.400000 
duration_ts=449850 
duration=4.998333 

Tôi tin rằng vấn đề dối trá một nơi nào đó trong thiết lập của tôi về libavformat ở đây: https://github.com/OpenWatch/FFmpegWrapper/blob/master/FFmpegWrapper/FFmpegWrapper.m#L349 nơi tôi đã thay đổi một loạt mã từ ffmpeg.c đã được yêu cầu cho bản sao luồng trực tiếp.

Vì 3600 có vẻ như một "số ma thuật" (60 * 60), nó có thể đơn giản như tôi không đặt đúng thang thời gian, nhưng tôi không thể tìm ra mã của tôi phân biệt với chính ffmpeg/avconv.

câu hỏi tương tự ở đây, nhưng tôi không nghĩ rằng họ đã như xa như tôi đã làm: Muxing a H.264 Annex B & AAC stream using libavformat with vcopy/acopy

Trả lời

1

Phải mất một thời gian, nhưng đây là câu trả lời: https://stackoverflow.com/a/16903982/805882

packet.pts = av_rescale_q(packet->pts, inStream->time_base, outStream->time_base); 
packet.dts = av_rescale_q(packet->dts, inStream->time_base, outStream->time_base); 
2

Trên thực tế điểm và dts của bạn đang sai lầm.

Tệp MP4 có pts và dts theo MP4 timebase và bạn đang chuyển cùng một điểm và dấu dts tới muxer ts hoạt động với đồng hồ 90000Hz. ví dụ: nếu khung hình/giây của bạn là 30 khung hình/giây thì trong ts nó sẽ có nghĩa là hiển thị một khung hình video trên mỗi 3000 bọ ve.

bạn nên sử dụng av_rescal_q để thay đổi điểm đổi từ mp4 thành ts timbase.

+0

Cảm ơn bạn! Tôi đã không hoàn toàn chắc chắn làm thế nào để rescale cơ sở thời gian đúng cách nhưng nó có vẻ như thế này có thể giúp chỉ cho tôi đi đúng hướng. Tôi sẽ cho bạn biết làm thế nào nó đi! –