ในบทความนี้ เราจะเรียนรู้คำสั่งทั่วไปบางอย่างสำหรับการแปลงและ การควบคุมลักษณะเฉพาะของไฟล์สื่อ แม้เราจะพยายามแสดงการดำเนินการที่เท่าเทียมกันสำหรับขั้นตอนทั้งหมด แต่การดำเนินการทั้งหมดก็เป็นไปได้ในทั้ง 2 แอปพลิเคชัน
ในหลายๆ กรณี คำสั่งที่เราแสดงอาจรวมกันอยู่ในการดำเนินการบรรทัดคำสั่งเดียว และจะถูกนำมาใช้จริง ตัวอย่างเช่น ไม่มีสิ่งใดป้องกันไม่ให้คุณตั้งค่าอัตราบิตของไฟล์เอาต์พุตในการทำงานเหมือนกับการแปลงไฟล์ สำหรับบทความนี้ เรามักจะแสดงการดำเนินการเหล่านี้เป็นคำสั่งแยกต่างหาก เพื่อความชัดเจน
การแปลง จะกระทำด้วยแอปพลิเคชันต่อไปนี้
ลักษณะการแสดงผล
สามารถใช้ทั้ง Shaka Packager และ FFmpeg เพื่อตรวจสอบเนื้อหาของไฟล์สื่อ จากนั้นแสดงลักษณะของสตรีม อย่างไรก็ตาม ทั้ง 2 อย่างนี้ จะให้เอาต์พุตที่แตกต่างกันสำหรับสื่อเดียวกัน
ลักษณะเฉพาะที่ใช้ Shaka Packager
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
ลักษณะเฉพาะที่ใช้ FFmpeg
ffmpeg -i glocken.mp4
เอาต์พุตจะมีลักษณะดังนี้
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'glocken.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.83.100
Duration: 00:00:10.03, start: 0.000000, bitrate: 8063 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc), 1920x1080, 7939 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, 127 kb/s (default)
Metadata:
handler_name : SoundHandler
At least one output file must be specified
Demux (แยกกัน) สตรีมเสียงและวิดีโอ
Shaka Packager กำหนดให้มีการแยกข้อมูลเมื่อแปลงไฟล์ ข้อกำหนดนี้ใช้กับ การใช้เฟรมเวิร์กสื่อด้วย
การกำจัด Shaka Packager
MP4
packager input=myvideo.mp4,stream=video,output=myvideo_video.mp4
packager input=myvideo.mp4,stream=audio,output=myvideo_audio.m4a
หรือ
packager \
input=myvideo.mp4,stream=video,output=myvideo_video.mp4 \
input=myvideo.mp4,stream=audio,output=myvideo_audio.m4a
WebM
packager \
input=myvideo.webm,stream=video,output=myvideo_video.webm \
input=myvideo.webm,stream=audio,output=myvideo_audio.webm
การกำจัด FFmpeg
MP4
ffmpeg -i myvideo.mp4 -vcodec copy -an myvideo_video.mp4
ffmpeg -i myvideo.mp4 -acodec copy -vn myvideo_audio.m4a
WebM
ffmpeg -i myvideo.webm -vcodec copy -an myvideo_video.webm
ffmpeg -i myvideo.webm -acodec copy -vn myvideo_audio.webm
Remux (รวม) สตรีมเสียงและวิดีโอ
ในบางกรณี คุณจะต้องรวมเสียงและวิดีโอไว้ในคอนเทนเนอร์เดียว โดยเฉพาะอย่างยิ่งเมื่อไม่ได้ใช้เฟรมเวิร์กสื่อ นี่เป็นสิ่งที่ FFmpeg สามารถจัดการได้ค่อนข้างดีและเป็นสิ่งที่ Shaka Packager ยังไม่รองรับในขณะนี้
ffmpeg -i myvideo_video.webm -i myvideo_audio.webm -c copy myvideo.webm
ลักษณะการเปลี่ยนแปลง
อัตราบิต
ส่วน FFmpeg จะทำได้เมื่อแปลงเป็น .mp4
หรือ .webm
ffmpeg -i myvideo.mov -b:v 350K myvideo.mp4
ffmpeg -i myvideo.mov -vf setsar=1:1 -b:v 350K myvideo.webm
ขนาด (ความละเอียด)
ffmpeg -i myvideo.webm -s 1920x1080 myvideo_1920x1080.webm
ประเภทไฟล์
Shaka Packager ประมวลผลไฟล์ .mov
ไม่ได้ จึงไม่สามารถแปลงไฟล์จากรูปแบบดังกล่าวได้
.mov
ถึง .mp4
ffmpeg -i myvideo.mov myvideo.mp4
.mov
ถึง .webm
ffmpeg -i myvideo.mov myvideo.webm
ซิงค์เสียงและวิดีโอ
แทรกคีย์เฟรมเพื่อให้แน่ใจว่าเสียงและวิดีโอซิงค์กันระหว่างการเล่น
ffmpeg -i myvideo.mp4 -keyint_min 150 -g 150 -f webm -vf setsar=1:1 out.webm
MP4/H.264
ffmpeg -i myvideo.mp4 -c:v libx264 -c:a copy myvideo.mp4
เสียงสำหรับ MP4
ffmpeg -i myvideo.mp4 -c:v copy -c:a aac myvideo.mp4
WebM/VP9
ffmpeg -i myvideo.webm -v:c libvpx-vp9 -v:a copy myvideo.webm
เสียงสำหรับ WebM
ffmpeg -i myvideo.webm -v:c copy -v:a libvorbis myvideo.webm
ffmpeg -i myvideo.webm -v:c copy -v:a libopus myvideo.webm
วิดีโอออนดีมานด์และสตรีมมิงแบบสด
โปรโตคอลสตรีมมิงมีอยู่ 2 ประเภทที่เราจะแสดงในบทความนี้ โซลูชันแรกคือการสตรีมแบบปรับอัตโนมัติผ่าน HTTP (DASH) ซึ่งเป็นเทคนิคการสตรีมแบบอัตราบิตที่ปรับเปลี่ยนได้และวิธีการนำเสนอวิดีโอออนดีมานด์ตามมาตรฐานเว็บ อย่างที่ 2 คือ HTTP Live Streaming (HLS) ซึ่งเป็นมาตรฐานของ Apple สำหรับสตรีมมิงแบบสดและวิดีโอออนดีมานด์สำหรับเว็บ
DASH/MPD
ตัวอย่างนี้สร้างไฟล์เอาต์พุต Media งานนำเสนอ (MPD) จากสตรีมเสียงและวิดีโอ
packager \
input=myvideo.mp4,stream=audio,output=myvideo_audio.mp4 \
input=myvideo.mp4,stream=video,output=myvideo_video.mp4 \
--mpd_output myvideo_vod.mpd
HLS
ตัวอย่างเหล่านี้จะสร้างไฟล์เอาต์พุต M3U8
จากสตรีมเสียงและวิดีโอ ซึ่งเป็นเพลย์ลิสต์มัลติมีเดียที่เข้ารหัส UTF-8
ffmpeg -i myvideo.mp4 -c:a copy -b:v 8M -c:v copy -f hls \
-hls_time 10 -hls_list_size 0 myvideo.m3u8
หรือทำดังนี้
packager \
'input=myvideo.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
'input=myvideo.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
--hls_master_playlist_output="master_playlist.m3u8"
ตอนนี้เมื่อเข้าใจวิธีแปลงไฟล์เป็นอย่างดีแล้ว ก็ต่อยอดสิ่งที่ได้เรียนรู้ในบทความนี้ไปได้เลยเพื่อเรียนรู้เกี่ยวกับการเข้ารหัสสื่อในลำดับถัดไป