ข้อมูลเบื้องต้นเกี่ยวกับแอปพลิเคชันสื่อ

เดเร็ก เฮอร์แมน
เดเร็ก เฮอร์แมน
โจ เมดเลย์
โจ เมดเลย์

การทำงานกับสื่อมักต้องมีการเปลี่ยนลักษณะของไฟล์สื่อ เช่น อัตราบิตหรือความละเอียด การหาวิธีเริ่มต้นง่ายๆ อาจเป็นเรื่องยาก ในหน้านี้ คุณจะได้เรียนรู้เกี่ยวกับเครื่องมือที่ใช้และวิธีติดตั้งอย่างรวดเร็ว

ก่อนอื่น เราจะอธิบายการใช้งานพื้นฐานสำหรับยูทิลิตีสื่อบรรทัดคำสั่งทั่วไป 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 เนื่องจากจะช่วยคุณประหยัดเวลาได้มาก ยิ่งไปกว่านั้น เรายังมีคำแนะนำที่จะช่วยให้คุณตั้งค่าได้อย่างรวดเร็ว

  1. เริ่มต้นด้วยการสร้างไดเรกทอรีใหม่บนคอมพิวเตอร์ที่ชื่อ media-tools คุณสามารถใช้ชื่อใดก็ได้ตามต้องการ แต่โปรดทราบว่าวิธีการต่อไปนี้สมมติว่าคุณใช้ media-tools เป็นชื่อไดเรกทอรี

  2. สร้างไดเรกทอรี docker และ media ภายใน media-tools ซึ่งจะทําให้ไดเรกทอรี media ของคุณไม่อยู่ในบริบทบิลด์ ขั้นตอนนี้สำคัญ เนื่องจาก media เป็นที่จัดเก็บไฟล์ที่เราวางแผนจะดำเนินการ และไฟล์บางไฟล์อาจมีขนาดใหญ่มาก การใส่ Dockerfile ใน media-tools โดยตรงจะทำให้การสร้างรูปภาพช้าลงหากคุณสร้างรูปภาพขึ้นมาใหม่หรืออาจจะเปลี่ยนเวอร์ชันที่ติดตั้ง

  3. สร้าง /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"]
    
  4. สร้างอิมเมจโดยใช้คำสั่งต่อไปนี้

    docker build -t media-tools ./docker
    
  5. เรียกใช้รูปภาพเป็นเชลล์แบบอินเทอร์แอกทีฟ บน 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 แล้ว คุณเรียนรู้แนวคิดพื้นฐานต่อไปได้ในส่วนข้อมูลเบื้องต้นเกี่ยวกับการสตรีมสื่อ