媒體轉換

Derek Herman
Derek Herman
Joe Medley
Joe Medley

在本文中,我們將介紹一些用於轉換及操控媒體檔案的特定特性的常用指令。雖然我們已嘗試顯示所有程序的相同作業,但並非所有作業都能同時執行。

在許多情況下,我們顯示的指令可能會在單一指令列作業中合併,當實際使用時就會合併。例如,您可以在與檔案轉換相同的作業中,設定輸出檔案的位元率。為求清楚起見,在本文中,我們通常會將這些作業顯示為個別指令。

轉換作業是透過下列應用程式來完成:

螢幕顯示特性

Shaka Packager 和 FFmpeg 都可用來檢查媒體檔案的內容,然後顯示串流的特性。但是,兩者會為相同的媒體提供不同的輸出內容。

使用 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

分解音訊和視訊串流

Shaka Packager 在轉換檔案時需要使用 demux。使用媒體架構也是必要條件。

Shaka Packager Demuxing

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 Demuxing

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

混合 (合併) 音訊和視訊串流

在某些情況下,您必須將音訊和視訊合併為單一容器。尤其是在不使用媒體架構的情況下這個 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

隨選影片與直播

本文將說明兩種類型的串流通訊協定。第一個是動態自動調整串流 (透過 HTTP,DASH),這是一種自動調整位元率串流技術和以網頁標準為基礎的方法,能夠以隨選方式呈現影片。第二個是 HTTP 即時串流 (HLS),這是 Apple 針對網路直播和隨選影片的標準

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

這些範例會透過音訊和影片串流 (即 UTF-8 編碼的多媒體播放清單) 產生 M3U8 輸出檔案。

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"

希望您已充分瞭解如何轉換檔案,接著我們可以繼續運用本文所學,並進一步學習媒體加密相關說明。