Thư viện này là một trình bao bọc xung quanh PHP-FFMpeg và đóng gói nội dung phương tiện để phát trực tuyến như DASH và HLS. Bạn cũng có thể sử dụng DRM cho bao bì HLS. Có một số tùy chọn để mở tệp từ đám mây và cũng lưu tệp vào đám mây
- Tài liệu đầy đủ có sẵn mô tả tất cả các tính năng và thành phần
- Để sử dụng mã hóa và DRM, tôi khuyên bạn nên dùng thử Shaka PHP, đây là một công cụ tuyệt vời cho trường hợp sử dụng này
nội dung
- Yêu cầu
- Cài đặt
- Bắt đầu nhanh
- Cấu hình
- Mở một tài nguyên
- DASH
- HLS
- Mã hóa [DRM]
- phụ đề
- chuyển mã
- Lưu tệp
- Metadata
- chuyển đổi
- Các tính năng nâng cao khác
- Thực thi tác vụ không đồng bộ
- Một số người chơi mã nguồn mở
- câu hỏi thường gặp
- Đóng góp và báo cáo lỗi
- Tín dụng
- Giấy phép
Yêu cầu
Phiên bản này của gói chỉ tương thích với PHP 7. 2 hoặc cao hơn
Để sử dụng gói này, bạn cần cài đặt FFmpeg. Bạn sẽ cần cả hai tệp nhị phân FFmpeg và FFProbe để sử dụng nó
Cài đặt
Cài đặt gói qua nhà soạn nhạc
composer require aminyazdanpanah/php-ffmpeg-video-streaming
Ngoài ra, thêm phần phụ thuộc trực tiếp vào tệp
require 'vendor/autoload.php'; // path to the autoload file7 của bạn
"require": { "aminyazdanpanah/php-ffmpeg-video-streaming": "^1.2" }
Bắt đầu nhanh
Trước hết, bạn cần đưa gói vào mã của mình
require 'vendor/autoload.php'; // path to the autoload file
Cấu hình
Gói này sẽ tự động phát hiện các tệp nhị phân FFmpeg và FFprobe. Nếu bạn muốn đưa ra các đường dẫn nhị phân một cách rõ ràng, bạn có thể chuyển một mảng dưới dạng cấu hình. Một Psr\Logger\LoggerInterface cũng có thể được chuyển để ghi nhật ký thực thi nhị phân
use Monolog\Handler\StreamHandler; use Monolog\Logger; $config = [ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', 'timeout' => 3600, // The timeout for the underlying process 'ffmpeg.threads' => 12, // The number of threads that FFmpeg should use ]; $log = new Logger['FFmpeg_Streaming']; $log->pushHandler[new StreamHandler['/var/log/ffmpeg-streaming.log']]; // path to log file $ffmpeg = Streaming\FFMpeg::create[$config, $log];
Mở một tài nguyên
Có một số cách để mở một tài nguyên
1. Từ tài nguyên được hỗ trợ FFmpeg
Bạn có thể chuyển đường dẫn cục bộ của video [hoặc tài nguyên được hỗ trợ] sang phương thức
require 'vendor/autoload.php'; // path to the autoload file8
$video = $ffmpeg->open['/var/media/video.mp4'];
Xem Tài liệu giao thức FFmpeg để biết thêm thông tin về các tài nguyên được hỗ trợ như HTTP, FTP, v.v.
Ví dụ
$video = $ffmpeg->open['//www.aminyazdanpanah.com/?"PATH TO A VIDEO FILE" or "PATH TO A LIVE HTTP STREAM"'];
2. từ đám mây
Bạn có thể mở tệp từ đám mây bằng cách chuyển một mảng cấu hình đám mây sang phương thức
require 'vendor/autoload.php'; // path to the autoload file9
$video = $ffmpeg->openFromCloud[$from_google_cloud];
Truy cập trang này để xem một số ví dụ về cách mở tệp từ Amazon S3, Google Cloud Storage, Microsoft Azure Storage và đám mây tùy chỉnh
3. Chụp webcam hoặc màn hình [Phát trực tiếp]
Bạn có thể chuyển tên của thiết bị chụp được kết nối, được hỗ trợ [i. e. tên của webcam, máy ảnh, màn hình, v.v.] vào phương thức
use Monolog\Handler\StreamHandler; use Monolog\Logger; $config = [ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', 'timeout' => 3600, // The timeout for the underlying process 'ffmpeg.threads' => 12, // The number of threads that FFmpeg should use ]; $log = new Logger['FFmpeg_Streaming']; $log->pushHandler[new StreamHandler['/var/log/ffmpeg-streaming.log']]; // path to log file $ffmpeg = Streaming\FFMpeg::create[$config, $log];0 để phát trực tiếp phương tiện truyền thông qua mạng
require 'vendor/autoload.php'; // path to the autoload file1
Để liệt kê các thiết bị chụp được kết nối, được hỗ trợ, hãy xem FFmpeg Capture Webcam và FFmpeg Capture Desktop
DASH
Truyền phát thích ứng động qua HTTP [DASH], còn được gọi là MPEG-DASH, là một kỹ thuật truyền phát tốc độ bit thích ứng cho phép truyền phát nội dung đa phương tiện chất lượng cao qua Internet được phân phối từ các máy chủ web HTTP thông thường. Tìm hiểu thêm
Tạo tệp DASH
require 'vendor/autoload.php'; // path to the autoload file2
Tạo biểu diễn thủ công
require 'vendor/autoload.php'; // path to the autoload file3
Xem phần DASH trong tài liệu, để biết thêm ví dụ
HLS
Phát trực tiếp HTTP [còn được gọi là HLS] là một giao thức liên lạc phát trực tuyến tốc độ bit thích ứng dựa trên HTTP do Apple Inc triển khai. như một phần của phần mềm QuickTime, Safari, OS X và iOS. Việc triển khai ứng dụng khách cũng có sẵn trong Microsoft Edge, Firefox và một số phiên bản của Google Chrome. Hỗ trợ phổ biến trong các máy chủ phương tiện truyền phát trực tuyến. Tìm hiểu thêm
Tạo tệp HLS
"require": { "aminyazdanpanah/php-ffmpeg-video-streaming": "^1.2" }0
Tạo biểu diễn thủ công
"require": { "aminyazdanpanah/php-ffmpeg-video-streaming": "^1.2" }1
Xem phần HLS trong tài liệu, để biết thêm các ví dụ như MP4 bị phân mảnh, trực tiếp từ máy ảnh/màn hình, v.v.
Mã hóa [DRM]
Quá trình mã hóa yêu cầu một số loại bí mật [khóa] cùng với thuật toán mã hóa. HLS sử dụng AES trong chế độ chuỗi khối mật mã [CBC]. Điều này có nghĩa là mỗi khối được mã hóa bằng cách sử dụng bản mã của khối trước đó. Tìm hiểu thêm
Bạn phải chỉ định đường dẫn để lưu khóa ngẫu nhiên vào máy cục bộ của mình, đồng thời chỉ định URL [hoặc đường dẫn] để truy cập khóa trên trang web của bạn [khóa bạn sẽ lưu phải có thể truy cập được từ trang web của bạn]. Bạn phải truyền cả hai tham số này cho phương thức
use Monolog\Handler\StreamHandler; use Monolog\Logger; $config = [ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', 'timeout' => 3600, // The timeout for the underlying process 'ffmpeg.threads' => 12, // The number of threads that FFmpeg should use ]; $log = new Logger['FFmpeg_Streaming']; $log->pushHandler[new StreamHandler['/var/log/ffmpeg-streaming.log']]; // path to log file $ffmpeg = Streaming\FFMpeg::create[$config, $log];1Phím đơn
Đoạn mã sau tạo khóa cho tất cả các tệp phân đoạn
"require": { "aminyazdanpanah/php-ffmpeg-video-streaming": "^1.2" }2Xoay phím
Một số nguyên dưới dạng "thời gian xoay khóa" cũng có thể được chuyển cho phương thức
use Monolog\Handler\StreamHandler; use Monolog\Logger; $config = [ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', 'timeout' => 3600, // The timeout for the underlying process 'ffmpeg.threads' => 12, // The number of threads that FFmpeg should use ]; $log = new Logger['FFmpeg_Streaming']; $log->pushHandler[new StreamHandler['/var/log/ffmpeg-streaming.log']]; // path to log file $ffmpeg = Streaming\FFMpeg::create[$config, $log];1 [i. e.
use Monolog\Handler\StreamHandler; use Monolog\Logger; $config = [ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', 'timeout' => 3600, // The timeout for the underlying process 'ffmpeg.threads' => 12, // The number of threads that FFmpeg should use ]; $log = new Logger['FFmpeg_Streaming']; $log->pushHandler[new StreamHandler['/var/log/ffmpeg-streaming.log']]; // path to log file $ffmpeg = Streaming\FFMpeg::create[$config, $log];3] để sử dụng một khóa khác cho từng nhóm phân đoạn, xoay sang khóa mới sau nhiều phân đoạn này. Ví dụ: nếu 10 tệp phân đoạn đã được tạo thì nó sẽ tạo khóa mới. Nếu bạn đặt giá trị này thành
use Monolog\Handler\StreamHandler; use Monolog\Logger; $config = [ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', 'timeout' => 3600, // The timeout for the underlying process 'ffmpeg.threads' => 12, // The number of threads that FFmpeg should use ]; $log = new Logger['FFmpeg_Streaming']; $log->pushHandler[new StreamHandler['/var/log/ffmpeg-streaming.log']]; // path to log file $ffmpeg = Streaming\FFMpeg::create[$config, $log];4, mỗi tệp phân đoạn sẽ được mã hóa bằng khóa mã hóa mới. Điều này có thể cải thiện bảo mật và cho phép linh hoạt hơn
Xem ví dụ để biết thêm thông tin
QUAN TRỌNG. Điều rất quan trọng là bảo vệ [các] khóa của bạn trên trang web của bạn. Ví dụ: bạn có thể sử dụng mã thông báo [sử dụng phương thức Nhận hoặc Đăng HTTP] để kiểm tra xem người dùng có đủ điều kiện để truy cập khóa hay không. Bạn cũng có thể sử dụng phiên [hoặc cookie] trên trang web của mình để hạn chế quyền truy cập vào [các] khóa [Rất khuyến khích]
DRMTuy nhiên, FFmpeg hỗ trợ mã hóa AES cho gói HLS mà bạn có thể mã hóa nội dung của mình, đây không phải là giải pháp DRM đầy đủ. Nếu bạn muốn sử dụng giải pháp DRM đầy đủ, tôi khuyên bạn nên dùng thử giải pháp Phát trực tuyến FairPlay, sau đó trao đổi khóa một cách an toàn và bảo vệ quá trình phát lại trên thiết bị
Bên cạnh hệ thống DRM FairPlay của Apple, bạn cũng có thể sử dụng các hệ thống DRM khác như PlayReady của Microsoft và Widevine của Google
phụ đề
Bạn có thể thêm phụ đề vào luồng HLS bằng phương pháp
use Monolog\Handler\StreamHandler; use Monolog\Logger; $config = [ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', 'timeout' => 3600, // The timeout for the underlying process 'ffmpeg.threads' => 12, // The number of threads that FFmpeg should use ]; $log = new Logger['FFmpeg_Streaming']; $log->pushHandler[new StreamHandler['/var/log/ffmpeg-streaming.log']]; // path to log file $ffmpeg = Streaming\FFMpeg::create[$config, $log];5
"require": { "aminyazdanpanah/php-ffmpeg-video-streaming": "^1.2" }3
GHI CHÚ. Tất cả các tệp m3u8 sẽ được tạo bằng các quy tắc dựa trên RFC 8216. Hiện chỉ có các tệp WebVTT được chấp nhận
chuyển mã
Một định dạng cũng có thể mở rộng
use Monolog\Handler\StreamHandler; use Monolog\Logger; $config = [ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', 'timeout' => 3600, // The timeout for the underlying process 'ffmpeg.threads' => 12, // The number of threads that FFmpeg should use ]; $log = new Logger['FFmpeg_Streaming']; $log->pushHandler[new StreamHandler['/var/log/ffmpeg-streaming.log']]; // path to log file $ffmpeg = Streaming\FFMpeg::create[$config, $log];6 để nhận thông tin thời gian thực về quá trình chuyển mã
"require": { "aminyazdanpanah/php-ffmpeg-video-streaming": "^1.2" }4Đầu ra từ một thiết bị đầu cuối
Lưu tệp
Có một số cách để lưu tệp
1. Đến một đường dẫn cục bộ
Bạn có thể chuyển một đường dẫn cục bộ tới phương thức
use Monolog\Handler\StreamHandler; use Monolog\Logger; $config = [ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', 'timeout' => 3600, // The timeout for the underlying process 'ffmpeg.threads' => 12, // The number of threads that FFmpeg should use ]; $log = new Logger['FFmpeg_Streaming']; $log->pushHandler[new StreamHandler['/var/log/ffmpeg-streaming.log']]; // path to log file $ffmpeg = Streaming\FFMpeg::create[$config, $log];7. Nếu không có thư mục trong đường dẫn, thì gói tự động tạo thư mục
"require": { "aminyazdanpanah/php-ffmpeg-video-streaming": "^1.2" }5
Nó cũng có thể là null. Đường dẫn mặc định để lưu tệp là đường dẫn đầu vào
"require": { "aminyazdanpanah/php-ffmpeg-video-streaming": "^1.2" }6
GHI CHÚ. Nếu bạn mở tệp từ đám mây và không chuyển đường dẫn để lưu tệp vào máy cục bộ của mình, bạn sẽ phải chuyển đường dẫn cục bộ đến phương thức
use Monolog\Handler\StreamHandler; use Monolog\Logger; $config = [ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', 'timeout' => 3600, // The timeout for the underlying process 'ffmpeg.threads' => 12, // The number of threads that FFmpeg should use ]; $log = new Logger['FFmpeg_Streaming']; $log->pushHandler[new StreamHandler['/var/log/ffmpeg-streaming.log']]; // path to log file $ffmpeg = Streaming\FFMpeg::create[$config, $log];7
2. lên mây
Bạn có thể lưu tệp của mình vào đám mây bằng cách chuyển một mảng cấu hình đám mây sang phương thức
use Monolog\Handler\StreamHandler; use Monolog\Logger; $config = [ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', 'timeout' => 3600, // The timeout for the underlying process 'ffmpeg.threads' => 12, // The number of threads that FFmpeg should use ]; $log = new Logger['FFmpeg_Streaming']; $log->pushHandler[new StreamHandler['/var/log/ffmpeg-streaming.log']]; // path to log file $ffmpeg = Streaming\FFMpeg::create[$config, $log];7
"require": { "aminyazdanpanah/php-ffmpeg-video-streaming": "^1.2" }7
Một đường dẫn cũng có thể được chuyển để lưu một bản sao của tệp vào máy cục bộ của bạn
"require": { "aminyazdanpanah/php-ffmpeg-video-streaming": "^1.2" }8
Truy cập trang này để xem một số ví dụ về lưu tệp vào Amazon S3, Google Cloud Storage, Microsoft Azure Storage và đám mây tùy chỉnh
GHI CHÚ. Tùy chọn này [Save To Clouds] chỉ hợp lệ cho VOD [không hỗ trợ phát trực tiếp]
Lược đồ. Mối quan hệ là
$video = $ffmpeg->open['/var/media/video.mp4'];0
3. Đến máy chủ ngay lập tức
Bạn có thể chuyển một URL [hoặc tài nguyên được hỗ trợ như
$video = $ffmpeg->open['/var/media/video.mp4'];1] sang phương thức trực tiếp để tải tất cả các tệp phân đoạn lên máy chủ HTTP [hoặc các giao thức khác] bằng phương thức HTTP PUT và cập nhật tệp kê khai mỗi lần làm mới
"require": { "aminyazdanpanah/php-ffmpeg-video-streaming": "^1.2" }9
GHI CHÚ. Ở định dạng HLS, bạn phải tải danh sách phát chính lên máy chủ theo cách thủ công. [Tải tệp
$video = $ffmpeg->open['/var/media/video.mp4'];2 lên tệp
$video = $ffmpeg->open['/var/media/video.mp4'];3]
Xem Tài liệu giao thức FFmpeg để biết thêm thông tin
Metadata
Bạn có thể lấy thông tin từ các luồng đa phương tiện và tệp video bằng mã sau
require 'vendor/autoload.php'; // path to the autoload file0
Xem ví dụ để biết thêm thông tin
chuyển đổi
Bạn có thể chuyển đổi luồng của mình thành một tệp hoặc sang một giao thức luồng khác. Bạn nên chuyển một bảng kê khai luồng tới phương thức
require 'vendor/autoload.php'; // path to the autoload file8
1. HLS sang DASH
require 'vendor/autoload.php'; // path to the autoload file1
2. DASH Đến HLS
require 'vendor/autoload.php'; // path to the autoload file2
3. Luồng [DASH hoặc HLS] để gửi
require 'vendor/autoload.php'; // path to the autoload file3
Các tính năng nâng cao khác
Bạn có thể dễ dàng sử dụng các tính năng nâng cao khác trong thư viện PHP-FFMpeg. Trên thực tế, khi bạn mở một tệp bằng phương thức
require 'vendor/autoload.php'; // path to the autoload file8 [hoặc
require 'vendor/autoload.php'; // path to the autoload file9], nó sẽ giữ đối tượng Phương tiện thuộc về PHP-FFMpeg
require 'vendor/autoload.php'; // path to the autoload file4
Trích xuất hình ảnh
Bạn có thể trích xuất khung tại bất kỳ mã thời gian nào bằng phương thức
$video = $ffmpeg->open['/var/media/video.mp4'];7
require 'vendor/autoload.php'; // path to the autoload file5
GHI CHÚ. Bạn có thể sử dụng hình ảnh làm áp phích của video
Gif
Một gif là một hình ảnh hoạt hình được trích xuất từ một chuỗi video
Bạn có thể lưu tệp gif bằng FFMpeg\Media\Gif. phương pháp lưu
require 'vendor/autoload.php'; // path to the autoload file6
Phương thức này có tham số boolean tùy chọn thứ ba, đó là thời lượng của hoạt ảnh. Nếu bạn không đặt nó, bạn sẽ nhận được một hình ảnh gif cố định
GHI CHÚ. Bạn có thể sử dụng gif làm hình thu nhỏ của video
Để xem thêm các ví dụ, hãy truy cập trang Tài liệu PHP-FFMpeg
Thực thi tác vụ không đồng bộ
Quá trình đóng gói có thể mất một lúc và bạn nên chạy nó ở chế độ nền [hoặc trên đám mây e. g. AWS]. Có một số thư viện mà bạn có thể sử dụng cho trường hợp sử dụng này
Bản giao hưởng [Thành phần bảng điều khiển]. Bạn có thể sử dụng thư viện này để tạo các lệnh dòng lệnh. Các lệnh bảng điều khiển của bạn có thể được sử dụng cho bất kỳ tác vụ định kỳ nào, chẳng hạn như cronjobs, import hoặc các công việc hàng loạt khác. Tìm hiểu thêm
Laravel[Hàng đợi]. Nếu bạn đang sử dụng Laravel để phát triển, Laravel Queues là một công cụ tuyệt vời cho trường hợp sử dụng này. Nó cho phép bạn tạo một công việc và gửi đi. Tìm hiểu thêm
GHI CHÚ. Bạn cũng có thể tạo một tập lệnh và chạy nó trong cronjob của mình
Một số người chơi mã nguồn mở
Bạn có thể sử dụng các thư viện này để phát các luồng của mình
- WEB
- DASH và HLS
- Video. js 7 [Được khuyến nghị] - videojs-http-streaming [VHS]
- ván ép
- DPlayer
- Yếu tố truyền thông. js
- vỗ tay
- Người chơi Shaka
- Trình phát lưu lượng
- DASH
- dấu gạch ngang. js
- HLS
- hls. js
- DASH và HLS
- Android
- DASH và HLS
- ExoPlayer [Được khuyến nghị]
- VLC cho Android
- DASH và HLS
- iOS
- DASH
- MPEG DASH-iOS-Player
- HLS
- Người chơi
- DASH
- Android và IOS
- DASH và HLS
- jkplayer
- DASH và HLS
- Windows, Linux và macOS
- DASH và HLS
- FFmpeg[ffplay] [Được khuyến nghị]
- Trình phát đa phương tiện VLC
- DASH và HLS
câu hỏi thường gặp
Tôi đã tạo tệp luồng và bây giờ tôi nên chuyển cái gì cho trình phát? . x.
$video = $ffmpeg->open['/var/media/video.mp4'];8 hoặc
$video = $ffmpeg->open['/var/media/video.mp4'];9 ] cho người chơi. Xem trang demo của những người chơi này để biết thêm thông tin [hls. js Bản trình diễn, dấu gạch ngang. js Demo, videojs Demo, v.v.]
Đầu phát của tôi không hiển thị nút chọn chất lượng để thay đổi chất lượng video? . Ví dụ: nếu bạn đang sử dụng Videojs để phát luồng của mình, bạn có thể cài đặt videojs-hls-quality-selector để hiển thị bộ chọn chất lượng. Để thêm một plugin cho những người chơi khác, bạn có thể dễ dàng Google nó
Tôi đã tải tệp luồng của mình lên đám mây nhưng nó không phát trên trang web của tôi? . e. Amazon S3], đảm bảo nội dung của bạn là CÔNG KHAI. Nếu không, bạn phải thay đổi kiểm soát truy cập
IOS có hỗ trợ luồng DASH không? . Mặc dù có một số thư viện như Viblast và MPEGDASH-iOS-Player hỗ trợ kỹ thuật này nhưng tôi chưa bao giờ thử nghiệm chúng. Vì vậy, có thể một số trong số họ sẽ không hoạt động bình thường
Xem trang này để biết thêm Câu hỏi thường gặp
Đóng góp và báo cáo lỗi
Tôi rất muốn sự giúp đỡ của bạn trong việc cải thiện, sửa chữa, thêm vào thông số kỹ thuật. Vui lòng gửi một vấn đề hoặc gửi yêu cầu kéo