Làm cách nào để tính toán sự khác biệt về nhịp độ với mã hóa luồng thời gian thực FFMPEG?


0

Bối cảnh: Tôi đang sử dụng FFMPEG để kết hợp luồng âm thanh và video thành luồng MPEGTS kết hợp qua mạng. Video được mã hóa trong h264 từ máy ảnh raspberry pi, âm thanh đi kèm được mã hóa từ một card âm thanh qua luồng TCP cục bộ. Một quy trình FFMPEG duy nhất chăm sóc mã hóa âm thanh dưới dạng AAC và kết hợp âm thanh / video.

Chỉ huy

raspivid --nopreview --ev 10 -ih -t 0 -rot 180 -w 720 -h 480 -fps 30 -b $BITRATE -g $KEYFRAME_PERIOD -pf baseline -o - | ffmpeg -r 30 -i - -i tcp://127.0.0.1:3000 -vcodec copy -acodec libfdk_aac -b:a 64k -ac 2 -filter:a "atempo=0.9945" -f mpegts tcp://192.168.42.2:6000

Vấn đề: Tôi gặp sự cố với đồng bộ hóa âm thanh và video theo thời gian. Tôi đã sửa lỗi chênh lệch thời gian ban đầu bằng cách tự điều chỉnh trình điều khiển card âm thanh, tuy nhiên theo thời gian, các luồng vẫn có thể hết chậm đồng bộ: âm thanh phát nhanh hơn một chút so với video. Để nó chạy trên cuối cùng sẽ khiến bộ đệm phát lại lấy mẫu lại âm thanh, dẫn đến độ trễ video tăng lên.

Lý do cho việc bù nhịp độ này có lẽ là do card âm thanh chạy trên đồng hồ của chính nó hơi khác so với pi mâm xôi. Tôi đã quản lý để giảm vấn đề này bằng bộ lọc âm thanh atempo . Tuy nhiên, xem xét điều này có thể chạy trong nhiều giờ đến nhiều ngày, nó là không đủ vì tốc độ đồng hồ pha lê sẽ thay đổi.

Câu hỏi: Xem xét âm thanh đi vào như một luồng âm thanh, tôi đã tự hỏi liệu có cách nào để tự động điều chỉnh nhịp độ để giữ cho thời gian mẫu âm thanh được đệm không đổi? Một cái gì đó làm cho FFMPEG duy trì luồng âm thanh ổn định, giữ x giây trong bộ đệm mọi lúc, làm chậm phát lại nếu bắt kịp bộ đệm. Tốc độ là chìa khóa ở đây: nếu nhịp độ không thay đổi, nó sẽ dẫn đến các vấn đề trong khi phát lại khi âm thanh và video được kết hợp.

Tôi không thể sử dụng các phương thức đồng bộ hóa tiêu chuẩn vì luồng h264 không có dấu thời gian và dấu thời gian của luồng ogg có vấn đề về nhịp độ.

Bất kỳ gợi ý để giải quyết điều này được đánh giá cao.


1
Tôi không tích cực điều này sẽ giải quyết nó cho bạn, bằng cách thử thêm -recờ vào ffmpeg
szatmary

Mặc dù các tài liệu có nói, -re Không nên được sử dụng với các thiết bị lấy thực tế hoặc luồng đầu vào trực tiếp (nơi có thể gây mất gói)
Gyan

Nếu đồng hồ nguồn âm thanh bị sai thì không có giải pháp ffmpeg chung nào có thể. Đôi khi các mẫu đến X có thể biểu thị Y giây của âm thanh thời gian thực và đôi khi là Z. Những gì bạn có thể thử nếu đồng hồ âm thanh không phải là vấn đề -af aresample=async=1thay vì atempo. Bộ lọc này sẽ cắt hoặc đệm âm thanh đầu ra nếu có quá nhiều hoặc hai gói âm thanh giữa hai dấu thời gian.
Gyan

Cảm ơn Mulvya, tiếc là nó không hoạt động. Đánh giá theo tài liệu của bộ cộng hưởng ffmpeg có lẽ phải làm với việc thiếu dấu thời gian trong luồng video h264. Tôi đã sử dụng -re trước khi phát trực tuyến video nhưng nó không hoạt động cho luồng tcp. Lý thuyết gần nhất tôi có thể nhận được đôi khi đặt lại luồng âm thanh thành "mẫu mới nhất", nhưng điều đó cũng hơi mơ hồ và tôi cho rằng ffmpeg thực sự không có gì cho nó.
berger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.