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.
-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)
-af aresample=async=1
thay 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.
-re
cờ vào ffmpeg