FFmpeg giới thiệu pipeline chuyển mã đa luồng
(ffmpeg.org)- Chuyển mã đa luồng của FFmpeg CLI đã được công bố dưới dạng phiên bản “hoạt động đầy đủ” đầu tiên sau khoảng 2 năm phát triển và hơn 700 commit chuẩn bị
- Do phạm vi thay đổi lớn, vẫn còn khả năng một số chức năng bị hỏng; trước khi merge thực tế, kiểm thử và review vẫn là nhiệm vụ then chốt
-fix_sub_duration_heartbeatkhó tránh hành vi không xác định khi chạy bất đồng bộ, do giả định đồng bộ hóa giữa decoder và encoder·muxer- Overhead của threading nhìn chung nhỏ, nhưng trong các tác vụ có khối lượng xử lý trên mỗi packet rất ít, chi phí này có thể nổi bật hơn lợi ích hiệu năng
- Nếu nút thắt cổ chai không tập trung vào một component đơn lẻ và mỗi component chưa ở trạng thái đã được đa luồng hóa sẵn, mức sử dụng CPU và thời gian xử lý thực tế trong môi trường đa lõi có thể được cải thiện đáng kể
Điểm chính của bản vá đa luồng cho FFmpeg CLI
- Sau khoảng 2 năm làm việc và hơn 700 commit chuẩn bị, phiên bản “fully functional” đầu tiên của FFmpeg CLI đa luồng đã được công bố dưới dạng một patch set
- Vì quy mô thay đổi lớn, vẫn có khả năng xảy ra lỗi chưa được phát hiện, nên cần kiểm thử và review dựa trên các trường hợp sử dụng thực tế
- Trong trường hợp thông thường, overhead của threading là nhỏ, nhưng với workload có khối lượng xử lý trên mỗi packet rất thấp, overhead có thể trở nên đáng kể
- Nếu quá trình chuyển mã không bị chi phối bởi một component đơn lẻ và các component chưa bị bão hòa bởi cơ chế đa luồng riêng của chúng, mức sử dụng CPU và thời gian chạy trên hệ thống đa lõi có thể được cải thiện
Ràng buộc vận hành và các vấn đề đã biết
- Tùy chọn
-fix_sub_duration_heartbeattrong kiến trúc hiện tại dựa trên giả định đồng bộ hóa giữa các component tách rời nhau- Luồng mục tiêu là đồng bộ hóa từ encoder·muxer đến decoder
- Khi mỗi component chạy bất đồng bộ, hành vi về cơ bản trở nên không xác định
- Ngay cả hiện tại, hành vi cũng khó dự đoán, nhưng nếu chạy với cùng tùy chọn thì kết quả giữa các lần chạy là xác định
- Trong bản vá 16/24, tùy chọn này bị vô hiệu hóa và cần một cách xử lý tốt hơn
Cấu trúc của patch set gồm 24 bản vá
- Patch set gồm tổng cộng 24 bản vá
- 01-09/24 là các chỉnh sửa chuẩn bị và có thể được push trước phần còn lại của series
- 10-17/24 chuyển encoding và filtering sang thread, đồng thời thực hiện các thay đổi chuẩn bị cần thiết
- Threading ở giai đoạn này là threading “giả”, trong đó main thread chờ các thread khác hoàn tất, nên chưa phải là chạy song song thực sự
- Vì overhead tạm thời có thể lớn hoặc một số corner case có thể bị hỏng, tốt hơn là chỉ push sau khi toàn bộ set đã sẵn sàng
- 18/24 là bản vá đơn lẻ lớn nhất, bổ sung transcode scheduler, nhưng ở thời điểm đó nó vẫn chưa thực sự hoạt động
- 19-24/24 chuyển từng component sang cách sử dụng scheduler
- Chúng được tách ra để review, nhưng khi push cuối cùng thì nên gộp lại
- Có thể xem tài liệu liên quan trong video bài trình bày VDD gần đây và nhánh
ffmpeg_threading- VDD talk
- nhánh ffmpeg_threading
1 bình luận
Ý kiến Hacker News
Trên máy chủ ARM 4 lõi, nhanh hơn khoảng 2 lần, và có vẻ hầu như không có overhead do song song hóa
ffmpeg_threading/ffmpeglà 7.771 giây, cònffmpeghiện tại là 13.841 giây; mức sử dụng CPU lần lượt là 218% và 114%Tôi tò mò nếu dùng tăng tốc phần cứng cho cả giải mã và mã hóa video trên card NVIDIA thì sẽ thế nào:
ffmpeg -hwaccel cuda -i $inputFile -codec:a copy -codec:v hevc_nvenc $outputCác phần việc khác có lẽ tương đối nhỏ xét về chi phí hiệu năng, nên dù cải thiện là đáng hoan nghênh, tôi đoán tác động thực tế sẽ khá hạn chế
Có lẽ nên liên kết tới https://ffmpeg.org/pipermail/ffmpeg-devel/2023-November/3165... thay vì tweet
Nội dung cốt lõi của tweet rốt cuộc cũng là liên kết này
Để hiểu nội dung này, tốt nhất nên xem bài trình bày của Anton tại VideoLAN Dev Days 2023: https://www.youtube.com/watch?v=Z4DS3jiZhfo&t=1221
Nó khiến tôi hình dung đến hướng xử lý animation thuộc tính mạnh mẽ hơn
Tweet dẫn tới http://ffmpeg.org/pipermail/ffmpeg-devel/2023-November/31655..., và từ đó lại tham chiếu tới mã nguồn https://git.khirnov.net/libav.git/log/?h=ffmpeg_threading
Tôi muốn biết liệu cái này có tự động được áp dụng hay không, hay là phải kết hợp rắc rối các tham số dòng lệnh
Tôi tò mò có phần mềm biên tập video nào dùng ffmpeg không
Có lúc tôi từng nghĩ đến việc làm thứ gì đó để vẽ hình bằng SVG rồi dùng ffmpeg, hoặc gắn UI vào, hoặc chỉ thêm văn bản, nhưng chưa bắt đầu
Avidemux hơi mang cảm giác như vậy, còn nội bộ ffmpeg thì khá thô, không có vẻ được dùng để GUI truy cập trực tiếp, nên một trình biên tập xây trên đó có lẽ sẽ chậm chạp, kỳ quặc và khó bảo trì
Tuy vậy, có vẻ vẫn có thể làm một trình biên tập dạng mô-đun, tạo preview bằng trình giải thích lệnh hoặc trình xem pipeline
ffmpeg rất mạnh, nhưng việc chỉ dùng qua dòng lệnh khiến nó trở thành rào cản với một số người dùng. Trước đây tôi từng viết một script Python nhận số lượng clip ngẫu nhiên rồi tạo mosaic bằng bộ lọc
xstack, và việc đó không hề dễhttps://vsdb.top/
https://www.vapoursynth.com/
Trong nhóm phần mềm ngách dựa trên ffmpeg, tôi đã thấy losslesscut: https://github.com/mifi/lossless-cut
Staxrip cũng khá lớn: https://github.com/staxrip/staxrip
Nhưng một trình biên tập “toàn diện” thì tôi không rõ
Tôi sẽ rất vui nếu các tác vụ transcoding nhỏ cho Plex nhanh hơn
Tôi không có hỗ trợ transcoding phần cứng từ card đồ họa, nên khá kỳ vọng
Tôi đang tìm cách tăng tốc độ transcoding, và một hướng là tăng tốc GPU, hướng còn lại là tăng số luồng
Chỉ là rất khó tìm được số luồng tối ưu
Tuy nhiên, nếu có thể thì tăng tốc GPU vẫn tốt hơn nhiều
Tôi tò mò về yêu cầu giấy phép khi triển khai ffmpeg ở quy mô lớn. Trong trường hợp nào thì phải trả phí?
http://ffmpeg.org/legal.html
Tức là miễn phí, nhưng nếu dùng một số mô-đun thì có thể phát sinh vấn đề khi trộn với mã nguồn độc quyền
Thật vui khi thấy FFmpeg tiếp tục được cải thiện. Hy vọng sớm có cả hỗ trợ Dolby AC4