การทำงานกับสื่อมักต้องมีการเปลี่ยนแปลงลักษณะของไฟล์สื่อ เช่น อัตราบิตหรือความละเอียด การหาวิธีง่ายๆ ในการเริ่มต้น อาจฟังดูเป็นเรื่องที่ค่อนข้างน่ากลัว ในหน้านี้ คุณจะได้เรียนรู้เกี่ยวกับเครื่องมือที่ใช้และวิธี ติดตั้งอย่างรวดเร็ว
ก่อนอื่น เราอธิบายการใช้งานพื้นฐานสำหรับยูทิลิตีสื่อบรรทัดคำสั่ง 2 แบบที่ใช้กันทั่วไป ได้แก่ Shaka Packager และ FFmpeg จากนั้นเราจะช่วยให้คุณติดตั้งเครื่องมือได้อย่างรวดเร็ว เหตุใดจึงต้องครอบคลุม 2 แอปพลิเคชัน แม้ว่าเครื่องมือทั้ง 2 ประเภทนี้จะมีประสิทธิภาพและมีประโยชน์ แต่ก็ไม่ได้ทำทุกอย่างที่จำเป็นเพื่อเตรียมสื่อสำหรับเว็บ นอกจากนี้ เรายังสร้างหน้า Conversion สำหรับสื่อและการเข้ารหัสสื่อ ซึ่งแสดงการดำเนินการทั่วไปอื่นๆ อีกมากมายกับแอปพลิเคชัน 2 ตัวนี้
แอปพลิเคชันเหล่านี้ไม่ใช่ตัวเลือกเดียวที่ใช้ได้สำหรับงานจัดการไฟล์ แต่เป็น 2 ตัวเลือกที่ใช้กันมากที่สุดและมีประสิทธิภาพ ตัวเลือกอื่นๆ ได้แก่ แอปพลิเคชัน GUI Miro, HandBrake และ VLC นอกจากนี้ ยังมีบริการเข้ารหัส/แปลงไฟล์ เช่น Zencoder, Amazon Elastic Encoder และ Google Transcoder API
ชากา Packager
Shaka Packager เป็น SDK การจัดแพ็กเกจสื่อฟรี หากคุณใช้มีเดียเพลเยอร์ในเว็บไซต์ Shaka Packager คือสิ่งที่คุณจะใช้ในการเตรียมไฟล์ ซึ่งรองรับการแปลงสำหรับโปรโตคอลสตรีมวิดีโอที่ใช้กันมากที่สุด 2 แบบ ได้แก่ Dynamic Adaptive Streaming over HTTP (DASH) หรือ HTTP Live Streaming (HLS) Shaka Packager รองรับฟีเจอร์ความปลอดภัยที่สำคัญ ได้แก่ การเข้ารหัสทั่วไปและการจัดการสิทธิ์ดิจิทัล (DRM) ของ Widevine ทั้งยังจัดการสตรีมมิงแบบสดและวิดีโอออนดีมานด์ได้ด้วย
แม้ว่าจะระบุอยู่บนแพ็กเกจ แต่ยูทิลิตีนี้มีไว้สำหรับนักพัฒนามากกว่า C++ คุณสามารถใช้โปรแกรมนี้เป็นทั้งไลบรารีสำหรับการสร้างซอฟต์แวร์สื่อและใช้เป็นยูทิลิตีบรรทัดคำสั่งสำหรับการเตรียมไฟล์สื่อสำหรับการเล่นบนเว็บ แต่คือความสามารถอย่างหลัง ที่มีประโยชน์สำหรับเราที่นี่ ที่จริงแล้ว สำหรับครีเอเตอร์สื่อบนเว็บ Shaka Packager เป็นวิธีเดียวในการทำงานบางอย่างโดยไม่ต้องใช้เงินไปกับแอปพลิเคชันเชิงพาณิชย์ที่มีราคาแพง
นี่คือรูปแบบพื้นฐานสำหรับคำสั่ง Shaka Packager
packager stream_descriptor [stream_descriptor-2 [stream_descriptor-n]] [flags]
คุณจะไม่ได้แสดงสิ่งนี้หากพิมพ์ packager -help
ตัวอย่างนี้อธิบายเหตุผลได้ง่ายกว่า และก็แสดงให้เห็นถึงตัวอย่างในเอกสารประกอบของ Shaka 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 เพียงแต่มีความแตกต่างกัน
รูปแบบพื้นฐานสำหรับคำสั่ง 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
เรียกใช้อิมเมจเป็น Shell แบบอินเทอร์แอกทีฟ บน 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 แล้ว ต่อไปคุณจะสามารถเรียนรู้แนวคิดพื้นฐานจากหัวข้อพื้นฐานการสตรีมสื่อได้