تبدیل رسانه

درک هرمان
Derek Herman
جو مدلی
Joe Medley

در این مقاله قصد داریم چند دستور رایج برای تبدیل و دستکاری ویژگی های خاص فایل های رسانه ای را بیاموزیم. اگرچه ما سعی کرده ایم عملیات معادل را برای همه رویه ها نشان دهیم، اما همه عملیات در هر دو برنامه امکان پذیر نیست.

در بسیاری از موارد، دستوراتی که ما نشان می‌دهیم ممکن است در یک عملیات خط فرمان واحد ترکیب شوند و زمانی که واقعاً استفاده می‌شوند، ترکیب می‌شوند. برای مثال، هیچ چیزی مانع از تنظیم نرخ بیت فایل خروجی در همان عملیات تبدیل فایل نیست. برای این مقاله، ما اغلب این عملیات را به عنوان دستورات جداگانه برای وضوح نشان می دهیم.

تبدیل با این برنامه ها انجام می شود:

هم Shaka Packager و هم FFmpeg می توانند برای بررسی محتوای یک فایل رسانه ای و سپس نمایش ویژگی های یک جریان استفاده شوند. با این حال، هر دو خروجی متفاوتی برای یک رسانه ارائه می دهند.

ویژگی های با استفاده از بسته بندی Shaka

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 در هنگام تبدیل فایل ها نیاز به دمکسینگ دارد. این برای استفاده از چارچوب های رسانه ای نیز لازم است.

دمکسینگ بسته بندی شاکا

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

صدا برای وب ام

ffmpeg -i myvideo.webm -v:c copy -v:a libvorbis myvideo.webm
ffmpeg -i myvideo.webm -v:c copy -v:a libopus myvideo.webm

ویدیوی درخواستی و پخش زنده

دو نوع پروتکل جریان وجود دارد که در این مقاله قصد داریم آنها را نشان دهیم. اولین مورد، جریان تطبیقی ​​پویا از طریق HTTP (DASH) است، که یک تکنیک جریان بیت تطبیقی ​​و روش مبتنی بر استانداردهای وب برای ارائه ویدیو بر اساس تقاضا است. دومی HTTP Live Streaming (HLS) است که استاندارد اپل برای پخش زنده و ویدیوی درخواستی برای وب است.

DASH/MPD

این مثال فایل خروجی توصیف ارائه رسانه (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"

اکنون که امیدواریم درک خوبی از نحوه تبدیل فایل‌ها داشته باشیم، می‌توانیم بر اساس آنچه در این مقاله آموخته‌ایم و در ادامه با رمزگذاری رسانه آشنا شویم.