การทำงานกับสื่อมักต้องมีการเปลี่ยนลักษณะของไฟล์สื่อ เช่น อัตราบิตหรือความละเอียด การหาวิธีเริ่มต้นง่ายๆ อาจเป็นเรื่องยาก ในหน้านี้ คุณจะได้เรียนรู้เกี่ยวกับเครื่องมือที่ใช้และวิธีติดตั้งอย่างรวดเร็ว
ก่อนอื่น เราจะอธิบายการใช้งานพื้นฐานสำหรับยูทิลิตีสื่อบรรทัดคำสั่งทั่วไป 2 รายการ ได้แก่ Shaka Packager และ FFmpeg จากนั้นเราจะช่วยให้คุณติดตั้งเครื่องมือได้อย่างรวดเร็ว ทำไมต้องครอบคลุมแอปพลิเคชัน 2 ตัว แม้เครื่องมือทั้งสองจะมีประสิทธิภาพและมีประโยชน์ในตัวเอง ก็ไม่ได้ทำทุกอย่างที่จำเป็นในการเตรียมสื่อสำหรับเว็บ นอกจากนี้ เรายังสร้างหน้าการแปลงสื่อและการเข้ารหัสสื่อซึ่งแสดงการดำเนินการอื่นๆ ที่พบได้บ่อยมากกว่า 2 รายการนี้
แอปพลิเคชันเหล่านี้ไม่ได้เป็นเพียงตัวเลือกเดียวสำหรับงานจัดการไฟล์ แต่เป็น 2 ตัวเลือกที่พบบ่อยที่สุดและมีประสิทธิภาพ ตัวเลือกอื่นๆ ได้แก่ แอปพลิเคชัน GUI Miro, HandBrake และ VLC นอกจากนี้ยังมีบริการการเข้ารหัส/การแปลง เช่น Zencoder, Amazon Elastic Encrypter และ Google Transcoder API
Shaka Packager
Shaka Packager เป็น SDK แพ็กเกจสื่อฟรี หากคุณใช้โปรแกรมเล่นสื่อในเว็บไซต์ คุณจะใช้ Shaka Packager เพื่อเตรียมไฟล์ โดยรองรับการแปลงสำหรับโปรโตคอลสตรีมวิดีโอที่พบบ่อยที่สุด 2 แบบ ได้แก่ การสตรีมที่ปรับเปลี่ยนได้แบบไดนามิกผ่าน HTTP (DASH) หรือ HTTP Live Streaming (HLS) Shaka Packager รองรับฟีเจอร์ความปลอดภัยที่สำคัญๆ ได้แก่ การเข้ารหัสทั่วไปและการจัดการสิทธิ์ดิจิทัล Widevine (DRM) รวมถึงรองรับสตรีมมิงแบบสดและวิดีโอออนดีมานด์
แม้จะมีข้อความบอกในแพ็กเกจ แต่ยูทิลิตีนี้มีไว้สำหรับนักพัฒนาซอฟต์แวร์ C++ มากกว่า คุณใช้ไฟล์นี้เป็นทั้งไลบรารีสำหรับการสร้างซอฟต์แวร์สื่อและใช้เป็นยูทิลิตีบรรทัดคำสั่งในการเตรียมไฟล์สื่อสำหรับการเล่นบนเว็บได้ นี่เป็นความจุหลังซึ่งมีประโยชน์สำหรับเรา อันที่จริง สำหรับผู้สร้างสื่อบนเว็บ Shaka Packager เป็นวิธีเดียวในการทำงานบางอย่างโดยไม่ต้องเสียเงินไปกับแอปพลิเคชันเชิงพาณิชย์ราคาแพง
ต่อไปนี้คือรูปแบบพื้นฐานสำหรับคำสั่ง Shaka Packager
packager stream_descriptor [stream_descriptor-2 [stream_descriptor-n]] [flags]
นี่ไม่ใช่สิ่งที่จะได้รับหากพิมพ์ packager -help
ตัวอย่างนี้ให้เหตุผลได้ง่ายกว่าและแสดงตัวอย่างในเอกสารประกอบของ Shaaka Packager โปรดทราบว่ามีรายการ stream_descriptor
หลายรายการในรูปแบบนี้ แม้เราจะไม่แสดง แต่คุณก็สามารถจัดการสตรีมวิดีโอและเสียงของไฟล์แยกกันได้ด้วยคำสั่งเดียว
เปรียบเทียบรูปแบบพื้นฐานนี้กับการใช้งานง่ายๆ ที่แสดงลักษณะของไฟล์ ในตัวอย่างนี้ เราได้จัดเรียงส่วนที่เทียบเท่ากัน
packager stream_descriptor [stream_descriptor-n] [flags]
packager input=glocken.mp4 --dump_stream_info
คำสั่งจะแสดงผลลัพธ์ดังนี้
File "glocken.mp4":
Found 2 stream(s).
Stream [0] type: Video
codec_string: avc1.640028
time_scale: 30000
duration: 300300 (10.0 seconds)
is_encrypted: false
codec: H264
width: 1920
height: 1080
pixel_aspect_ratio: 1:1
trick_play_factor: 0
nalu_length_size: 4
Stream [1] type: Audio
codec_string: mp4a.40.2
time_scale: 48000
duration: 481280 (10.0 seconds)
is_encrypted: false
codec: AAC
sample_bits: 16
num_channels: 2
sampling_frequency: 48000
language: eng
seek_preroll_ns: 20833
ลองมองหาลักษณะเฉพาะที่กล่าวถึงในข้อมูลเบื้องต้นเกี่ยวกับไฟล์สื่อ และสังเกตสิ่งต่างๆ ต่อไปนี้ ความสูงและความกว้างถูกต้องสำหรับ Full HD และตัวแปลงรหัสเสียงและวิดีโอเป็นหนึ่งในตัวแปลงรหัสที่แนะนำให้ใช้กับประเภทคอนเทนเนอร์ ซึ่งได้แก่ AAC สำหรับเสียง และ H264 สำหรับวิดีโอ โปรดสังเกตด้วยว่าสตรีมจะมีตัวเลขด้วย การดำเนินการดังกล่าวมีประโยชน์สำหรับการดำเนินการที่จัดการเสียงและวิดีโอแบบแยกกัน
โปรดสังเกตว่าเอาต์พุตด้านบนไม่แสดงอัตราบิต ถึงแม้ว่าจะขาดข้อมูลใดไป แต่เอาต์พุตนี้อ่านง่ายกว่า เราจึงใช้ได้ทุกเมื่อที่ทำได้ เมื่อเราต้องการข้อมูลที่ Shaka Packager หาไม่ได้ เช่น อัตราบิต เราจะใช้ FFmpeg
FFmpeg
FFmpeg เป็นแอปพลิเคชันฟรีสำหรับบันทึก แปลง และสตรีมไฟล์สื่อ ความสามารถของ Shaka Packager ไม่ได้ดีไปกว่าหรือแย่กว่า Shaka Packager ต่างกันตรงนั้น
รูปแบบพื้นฐานสำหรับคำสั่ง FFmpeg จะมีลักษณะดังนี้
ffmpeg [GeneralOptions] [InputFileOptions] -i input [OutputFileOptions] output
แอปพลิเคชันนี้จัดการสตรีมหลายรายการได้ เช่นเดียวกับ Shaka Packager บางตัวเลือกของตัวเลือกจะนำไปใช้ในหลายๆ ตำแหน่งและจัดการเอาต์พุตไฟล์แตกต่างกันโดยขึ้นอยู่กับตำแหน่งของคำสั่ง โปรดคำนึงถึงเรื่องนี้เมื่อดูคำถาม FFmpeg ใน Stack Overflow และเว็บไซต์ที่คล้ายกัน
เราจะเปรียบเทียบรูปแบบพื้นฐานกับตัวอย่างสำหรับการแสดงลักษณะเฉพาะของไฟล์อีกครั้ง
ffmpeg [GeneralOptions] [InputFileOptions] -i input [OutputFileOptions] output
ffmpeg -i glocken.mp4
นอกจากข้อมูลที่เราขอแล้ว ข้อความแสดงข้อผิดพลาดนี้จะพิมพ์ข้อความแสดงข้อผิดพลาดตามที่แสดงในตัวอย่างด้านล่างด้วย นั่นเป็นเพราะว่าในทางเทคนิคแล้ว เป็นการใช้ FFmpeg ที่ไม่ถูกต้อง เราใช้ฟีเจอร์นี้เนื่องจากแสดงข้อมูลที่เราให้ความสำคัญ
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'glocken.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.17.100
Duration: 00:01:47.53, start: 0.000000, bitrate: 10715 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 1920x1080, 10579 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : SoundHandler
At least one output file must be specified
การติดตั้งแอปพลิเคชันด้วย Docker
หากวางแผนที่จะทำตามและลองใช้คำสั่งของเรา คุณจะติดตั้งเครื่องมือที่จำเป็นด้วยตนเองหรือใช้ Docker ก็ได้ เราขอแนะนำให้ใช้ Docker เนื่องจากจะช่วยคุณประหยัดเวลาได้มาก ยิ่งไปกว่านั้น เรายังมีคำแนะนำที่จะช่วยให้คุณตั้งค่าได้อย่างรวดเร็ว
เริ่มต้นด้วยการสร้างไดเรกทอรีใหม่บนคอมพิวเตอร์ที่ชื่อ
media-tools
คุณสามารถใช้ชื่อใดก็ได้ตามต้องการ แต่โปรดทราบว่าวิธีการต่อไปนี้สมมติว่าคุณใช้media-tools
เป็นชื่อไดเรกทอรีสร้างไดเรกทอรี
docker
และmedia
ภายในmedia-tools
ซึ่งจะทําให้ไดเรกทอรีmedia
ของคุณไม่อยู่ในบริบทบิลด์ ขั้นตอนนี้สำคัญ เนื่องจากmedia
เป็นที่จัดเก็บไฟล์ที่เราวางแผนจะดำเนินการ และไฟล์บางไฟล์อาจมีขนาดใหญ่มาก การใส่Dockerfile
ในmedia-tools
โดยตรงจะทำให้การสร้างรูปภาพช้าลงหากคุณสร้างรูปภาพขึ้นมาใหม่หรืออาจจะเปลี่ยนเวอร์ชันที่ติดตั้งสร้าง
/media-tools/docker/Dockerfile
และเพิ่มวิธีการสร้างต่อไปนี้FROM google/shaka-packager:release-v2.4.3 as packager FROM jrottenberg/ffmpeg:4.3.2-alpine38 COPY --from=packager /usr/bin /usr/bin ENTRYPOINT ["sh"]
สร้างอิมเมจโดยใช้คำสั่งต่อไปนี้
docker build -t media-tools ./docker
เรียกใช้รูปภาพเป็นเชลล์แบบอินเทอร์แอกทีฟ บน Linux:
docker run -w /media -v ${PWD}/media:/media -it --rm media-tools /media #
บน Windows:
docker run -w /media -v %cd%/media:/media -it --rm media-tools /media #
ขณะที่เรียกใช้อิมเมจ คุณสามารถตรวจสอบเวอร์ชันของทั้ง FFmpeg และ Shaka Packager เพื่อตรวจสอบว่าทุกอย่างดำเนินการสำเร็จด้วยการเรียกใช้ ffmpeg -version
และ packager --version
ผลลัพธ์ควรมีลักษณะดังนี้
/media # ffmpeg -version
ffmpeg version 4.3.2 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 6.4.0 (Alpine 6.4.0)
configuration: --disable-debug --disable-doc --disable-ffplay --enable-shared --enable-avresample --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-gpl --enable-libass --enable-fontconfig --enable-libfreetype --enable-libvidstab --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxcb --enable-libx265 --enable-libxvid --enable-libx264 --enable-nonfree --enable-openssl --enable-libfdk_aac --enable-postproc --enable-small --enable-version3 --enable-libbluray --enable-libzmq --extra-libs=-ldl --prefix=/opt/ffmpeg --enable-libopenjpeg --enable-libkvazaar --enable-libaom --extra-libs=-lpthread --enable-libsrt --enable-libaribb24 --extra-cflags=-I/opt/ffmpeg/include --extra-ldflags=-L/opt/ffmpeg/lib
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 / 58. 45.100
libavdevice 58. 10.100 / 58. 10.100
libavfilter 7. 85.100 / 7. 85.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 7.100 / 5. 7.100
libswresample 3. 7.100 / 3. 7.100
libpostproc 55. 7.100 / 55. 7.100
/media # packager --version
packager version v2.4.3-dd9870075f-release
เมื่อลองใช้ Shaka Packager และ FFmpeg แล้ว คุณเรียนรู้แนวคิดพื้นฐานต่อไปได้ในส่วนข้อมูลเบื้องต้นเกี่ยวกับการสตรีมสื่อ