Khi phát tới luồng trực tiếp, có thể bạn sẽ sử dụng một số loại phần mềm phát trực tuyến trên máy tính để bàn như OBS, Streamlabs hoặc bất kỳ chương trình tuyệt vời nào khác có sẵn cho tác vụ như chúng ta đã xem xét trước đây trên blog này . Một tùy chọn khác mà chúng tôi đã xem xét ở đây là phát sóng từ một trình duyệt với SDK phát sóng web của Dịch vụ video tương tác Amazon (Amazon IVS). Hai tùy chọn phát này bao gồm phần lớn các trường hợp sử dụng, nhưng chúng không phải là tùy chọn duy nhất có sẵn cho chúng tôi. Trong bài đăng này, chúng ta sẽ thảo luận về một tùy chọn khác - phát sóng không đầu (IE: không có giao diện người dùng) thông qua dòng lệnh với FFMPEG.
Chủ đề này đã được đề cập kỹ lưỡng trong hướng dẫn sử dụng Amazon IVS nhưng muốn tìm hiểu sâu hơn một chút và thảo luận về cách chúng tôi có thể mở rộng giải pháp cho các trường hợp sử dụng cụ thể. Có thể đôi khi bạn muốn phát trực tiếp nội dung nào đó mà không có phản hồi trực quan ngay lập tức do giao diện người dùng cung cấp. Ví dụ: có thể bạn cần phát một video đã quay trước trên kênh của chúng tôi? Hoặc, còn việc truyền phát lại từ một camera IP trên mạng của bạn sử dụng một giao thức như RTSP hoặc một số định dạng khác có thể không phải là định dạng RTMP mà Amazon IVS yêu cầu thì sao? Có một số trường hợp sử dụng, vì vậy hãy tìm hiểu một số trường hợp trong số đó.
Lưu ý: Để tránh chia nhỏ từng câu lệnh và thảo luận về chức năng của từng đối số, các đoạn mã nhúng bên dưới sẽ được nhận xét. Điều này có thể không tốt cho việc sử dụng sao chép/dán, vì vậy mỗi đoạn mã có một liên kết đến một phiên bản lệnh không bị chú thích trên GitHub.
Để chơi cùng ở nhà, hãy đảm bảo bạn đã cài đặt FFMPEG . Tất cả các lệnh bên dưới đã được thử nghiệm trên MacOS, vì vậy có thể cần phải sửa đổi một số lệnh nếu bạn đang sử dụng một hệ điều hành khác. Cuối cùng, tôi nên đề cập rằng tôi không phải là một chuyên gia FFMPEG, nhưng đã kiểm tra đầy đủ mọi lệnh kể từ ngày xuất bản ban đầu của bài đăng này trên phiên bản 5.1.2
.
Một điều nữa: Tôi biết việc chỉ sao chép và dán các lệnh sẽ rất hấp dẫn, nhưng vui lòng dành thời gian đọc các nhận xét và tham khảo tài liệu FFMPEG để đảm bảo khả năng tương thích với môi trường của bạn. Ví dụ: nhiều lệnh bên dưới đang sử dụng
6000k
cho tốc độ bit mục tiêu nhưng điều này có thể không hoạt động đối với kênh của bạn nếu bạn đang sử dụng loại kênhBASIC
.
Bạn sẽ cần điểm cuối Ingest và khóa Luồng để thu thập những điểm đó từ kênh của bạn thông qua Bảng điều khiển Amazon IVS.
Đối với kênh demo của tôi, tôi đã đặt các giá trị này thành các biến môi trường DEMO_STREAM_INGEST_ENDPOINT
và DEMO_STREAM_KEY
.
Tiếp theo, liệt kê các thiết bị âm thanh và video của bạn với FFMPEG:
$ ffmpeg -list_devices true -f avfoundation -i dummy
Nếu đang dùng Windows, bạn sẽ cần sử dụng
-f dshow
để thay thế.
Trên máy của tôi, lệnh này tạo ra đầu ra sau.
[AVFoundation indev @ 0x11d605c80] AVFoundation video devices: [AVFoundation indev @ 0x11d605c80] [0] OBS Virtual Camera [AVFoundation indev @ 0x11d605c80] [1] ManyCam Virtual Webcam [AVFoundation indev @ 0x11d605c80] [2] FaceTime HD Camera [AVFoundation indev @ 0x11d605c80] [3] Capture screen 0 [AVFoundation indev @ 0x11d605c80] AVFoundation audio devices: [AVFoundation indev @ 0x11d605c80] [0] ManyCam Virtual Microphone [AVFoundation indev @ 0x11d605c80] [1] BlackHole 2ch [AVFoundation indev @ 0x11d605c80] [2] External Microphone
Trong các lệnh bên dưới, chúng tôi sẽ tham chiếu thiết bị theo chỉ mục (ví dụ: 2
cho "Camera FaceTime HD").
Trường hợp sử dụng đơn giản nhất là luồng máy ảnh và micrô đơn giản.
$ ffmpeg \ -f avfoundation \ # force the format -video_size 1920x1080 \ # video size -framerate 30 \ # FPS -i "2:2" \ # input device (video:audio) -c:v libx264 \ # codec - libx264 is an advanced encoding library for creating H. 264 (MPEG-4 AVC) video streams -b:v 6000K \ # target bitrate -maxrate 6000K \ # max bitrate -pix_fmt yuv420p \ # pixel format -s 1920x1080 \ # video size -profile:v main \ # the H.264 profile (https://trac.ffmpeg.org/wiki/Encode/H.264#Profile) -preset veryfast \ # encoder quality setting -g 120 \ # group of picture (GOP) size -x264opts "nal-hrd=cbr:no-scenecut" \ -acodec aac \ # audio codec -ab 160k \ # audio bitrate -ar 44100 \ # audio sample rate -f flv \ # output video format $DEMO_STREAM_INGEST_ENDPOINT/$DEMO_STREAM_KEY
Sử dụng lệnh trên sẽ tạo luồng trực tiếp sau.
Một trường hợp sử dụng phổ biến khác là phát trực tuyến chia sẻ màn hình với video được phủ ở một vị trí nhất định. Lệnh này phức tạp hơn một chút, nhưng các nhận xét sẽ giải thích điều gì đang xảy ra.
$ ffmpeg \ -f avfoundation \ # force format for input 0 -framerate 30 \ # input 0 framerate -video_size 1920x1080 \ # input 0 size -i "3:" \ # first (index 0) input (screenshare) -f avfoundation \ # force format for input 1 -framerate 30 \ # input 1 framerate -video_size 640x480 \ # input 1 size -i "2:" \ # second (index 1) input (camera) -f avfoundation \ # force format for input 2 -i ":2" \ # third (index 2) input (mic) -filter_complex "[0:v][1:v] overlay=main_w-overlay_w-5:main_h-overlay_h-5" \ # overlay video on screenshare in the bottom right -map 0:v:0 \ # use the video from input 0 -map 1:v:0 \ # use the video from input 1 -map 2:a:0 \ # use the video from input 2 -c:v libx264 \ # codec - libx264 is an advanced encoding library for creating H. 264 (MPEG-4 AVC) video streams -b:v 6000K \ # target bitrate -maxrate 6000K \ # max bitrate -pix_fmt yuv420p \ # pixel format -s 1920x1080 \ # video size -profile:v main \ # the H.264 profile (https://trac.ffmpeg.org/wiki/Encode/H.264#Profile) -preset veryfast \ # encoder quality setting -g 120 \ # group of picture (GOP) size -x264opts "nal-hrd=cbr:no-scenecut" \ -acodec aac \ # audio codec -ab 160k \ # audio bitrate -ar 44100 \ # audio sample rate -f flv \ # output video format $DEMO_STREAM_INGEST_ENDPOINT/$DEMO_STREAM_KEY
Lệnh này tạo ra đầu ra giống như sau:
Đối với nội dung được ghi trước, chúng tôi có thể trao đổi đầu vào máy ảnh để lấy đường dẫn đến tệp video hiện có trên hệ thống tệp cục bộ của chúng tôi.
$ ffmpeg \ -re \ -i /path/to/video.mp4 \ #input video -c:v libx264 \ # codec - libx264 is an advanced encoding library for creating H. 264 (MPEG-4 AVC) video streams -b:v 6000K \ # target (average) bitrate for the encoder -maxrate 6000K \ # max bitrate -pix_fmt yuv420p \ # pixel format -s 1920x1080 \ # size -profile:v main \ # the H.264 profile (https://trac.ffmpeg.org/wiki/Encode/H.264#Profile) -preset veryfast \ # encoder quality setting -force_key_frames "expr:gte(t,n_forced*2)" \ # keyframe interval -x264opts "nal-hrd=cbr:no-scenecut" \ -acodec aac \ # audio codec -ab 160k \ # audio bitrate -ar 44100 \ # audio sample rate -f flv \ # output video format $DEMO_STREAM_INGEST_ENDPOINT/$DEMO_STREAM_KEY
Đầu ra ở đây tương tự như đầu ra của webcam, nhưng chứa nội dung video được ghi trước với âm thanh được nhúng.
Đôi khi video được quay trước của chúng tôi không chứa âm thanh, nhưng có thể chúng tôi muốn bao gồm một đoạn âm thanh riêng. Điều này hữu ích để tạo trải nghiệm như luồng "lofi radio" sử dụng video hoạt hình và bản âm thanh riêng biệt. Xin lưu ý rằng luồng này sẽ lặp lại vô hạn video và âm thanh, vì vậy, bạn cần lưu ý rằng thời lượng phát trực tiếp được giới hạn trong 48 giờ liên tục.
$ ffmpeg \ -re \ -stream_loop -1 \ # loop video infinitely -i /path/to/video.mp4 \ # input (video) -stream_loop -1 \ # loop audio infinitely -i /path/to/audio.mp3 \ # input (audio) -map 0:v:0 \ # map the first video stream from the first video file -map 1:a:0 \ # map the first audio stream from the second file -c:v libx264 \ # codec - libx264 is an advanced encoding library for creating H. 264 (MPEG-4 AVC) video streams -b:v 6000K \ # target (average) bitrate for the encoder -maxrate 6000K \ # max bitrate -pix_fmt yuv420p \ # pixel format -s 1920x1080 \ # size -profile:v main \ # the H.264 profile (https://trac.ffmpeg.org/wiki/Encode/H.264#Profile) -preset veryfast \ # encoder quality setting -force_key_frames "expr:gte(t,n_forced*2)" \ # keyframe interval -x264opts "nal-hrd=cbr:no-scenecut" \ -acodec aac \ # audio codec -ab 160k \ # audio bitrate -ar 44100 \ # audio sample rate -f flv \ # output video format $DEMO_STREAM_INGEST_ENDPOINT/$DEMO_STREAM_KEY
Ví dụ cuối cùng mà chúng tôi sẽ trình bày là trường hợp sử dụng phát lại. Có thể hữu ích khi sử dụng nguồn đầu vào không tạo ra đầu ra RTMP. Một số camera IP nhất định và các thiết bị khác tạo đầu ra ở dạng RTSP và với FFMPEG, chúng tôi có thể chuyển hướng đầu vào từ các thiết bị này sang luồng trực tiếp Amazon IVS của chúng tôi.
$ ffmpeg \ -rtsp_transport \ tcp \ -i rtsp://user:[email protected]:554 \ # IP camera URI -preset ultrafast \ # encoder quality setting -vcodec libx264 \ # codec -ar 44100 \ # audio bitrate -f flv \ # output video format $DEMO_STREAM_INGEST_ENDPOINT/$DEMO_STREAM_KEY
Lệnh này tạo ra đầu ra như sau.
Trong bài đăng này, chúng tôi đã xem xét cách phát trực tuyến tới luồng trực tiếp Amazon IVS theo cách không có đầu với FFMPEG. Nếu bạn có trường hợp sử dụng không được đề cập trong bài đăng này, hãy liên hệ với tôi trên Twitter .