Transcoding waktu-nyata ke H264 + AAC dalam wadah Matroska

2

Skenario

Saya memiliki perpustakaan film yang ingin saya streamable ke tablet Android saya menggunakan VLC untuk pemutaran. Saya ingin menggunakan H264 + AAC untuk kualitas visual terbaik melalui koneksi internet seluler. Saya juga ingin menggunakan wadah Matroska yang mendukung teks terjemahan yang bertentangan dengan subtitle bitmap yang didukung MPEG2TS.

Saya telah menginstal Mediatomb dan UPnP berfungsi sebagaimana mestinya, saya dapat melakukan streaming video dan audio dengan baik tanpa transcoding.

Masalah

Saya bisa transcode dan downsample ke MPEG2. Tetapi pemutaran H264 berhenti setelah 10-40 detik di tempat yang persis sama setiap kali untuk satu video tetapi tempat yang berbeda untuk setiap video. Pemutaran bahkan tidak dimulai pada VLC pada PC (berhenti setelah frame pertama).

Konfigurasi

Saya menggunakan skrip ini

#!/bin/bash
LINES=720
PRESET=veryfast
PROFILE=main
TUNE=zerolatency

AUDIO="-c:a libfaac -b:a 128k -ar 48000 -ac 2 -async 1"
# Works well
VIDEO="-c:v mpeg2video -b 8192k"
# Freezes after a few seconds seconds.
#VIDEO="-c:v libx264 -preset ${PRESET} -tune ${TUNE} -profile ${PROFILE}" 
SUBTITLES="-c:s copy"

exec /usr/bin/ffmpeg -threads 2 -i "${1}" -filter:v scale=-1:720 $VIDEO \
$AUDIO $SUBTITLES -f matroska -y "${2}" &> /store/tmp/log

Konfigurasi mediatomb saya dengan bagian yang relevan:

<profile name="h264stream" enabled="yes" type="external">
  <mimetype>video/x-matroska</mimetype>
  <accept-url>no</accept-url>
  <first-resource>yes</first-resource>
  <hide-original-resource>yes</hide-original-resource>
  <accept-ogg-theora>yes</accept-ogg-theora>
  <sample-frequency>48000</sample-frequency>
  <audio-channels>2</audio-channels>
  <agent command="/etc/mediatomb/ffmpeg.sh" arguments="%in %out"/>
  <buffer size="104857600" chunk-size="262144" fill-size="524288"/>
</profile>

Jika aku melakukan tail -f /store/tmp/log Saya dapat melihat bahwa proses FFMPEG masih melakukan penyandian bahkan setelah pemutaran berhenti pada tablet. Infact, itu cukup senang mengunyah. Dan itu juga pengkodean pada tingkat yang lebih cepat dari bahan sumber sehingga tidak tertinggal. Pemutaran pada tablet halus sampai tiba-tiba berhenti.

Saya sudah mencoba menggunakan parameter preset, profil dan tune yang berbeda tetapi tidak berhasil, waktu hingga membeku tampaknya berbanding terbalik dengan seberapa cepat encoder berjalan (kecepatan encoding tinggi, waktu singkat untuk membekukan)

Emily L.
sumber

Jawaban:

4

Sesuaikan aliran h264 agar dapat di-stream:

Rupanya codec h264 memiliki mode khusus yang diperlukan agar dapat efisien streaming dan Anda mengaktifkannya dengan: -bsf:v h264_mp4toannexb

Naskah

Script yang saya gunakan untuk menyiapkan pipa streaming matroska H264 + AAC adalah ini

#!/bin/bash 
# ----------------------------------------------------------------------------
# This script is a helper to transcode a video to H264+AAC with subtitles to a 
# Matroska (.mkv) container that is suitable for live streaming to a mobile 
# device. It will transcode media that is not H264 or that has too high 
# resolution. It will not upsample content. 
# 
# Other suitable containers (and reasons for not using them) include: 
# * ASF (Microsoft, proprietary) 
# * MPEG2 Transport Stream (Standard, only supports bitmap subtitles) 
# * WebM (Has no support for metadata) 
# * DivX (Can't contain H264) 
# * FLV (Proprietary Bad support on target device) 
# * MP4 (Only bitmap subtitles, didn't work for streaming with FFMPEG) 
# * OGG (No support for H264) 
# ----------------------------------------------------------------------------

# ----------------------------------------------------------------------------
# Video options 
# ----------------------------------------------------------------------------
LINES=720

# One of: ultrafast,superfast, veryfast, faster, fast, medium, slow, slower, 
# veryslow or placebo 
PRESET=ultrafast 

# One of: baseline, main, high, high10, high422 or high444 
PROFILE=high10 

# One of: film animation grain stillimage psnr ssim fastdecode zerolatency 
TUNE=zerolatency 

# ----------------------------------------------------------------------------
# Audio options 
# ----------------------------------------------------------------------------
AUDIO="-c:a libfaac -b:a 128k -ar 48000 -ac 2 -async 1"

SUBTITLES="-c:s copy"

# ----------------------------------------------------------------------------
# Read input video parameters 
# ----------------------------------------------------------------------------
IN_RESOLUTION=`/usr/bin/ffmpeg -i "${1}" 2>&1 | grep Video | \
    perl -lane 'print $1 if /(\d+x\d+)/'`
IN_CODEC=`/usr/bin/ffmpeg -i "${1}" 2>&1 | grep Video | \
    perl -lane 'print $1 if /Video: (\S+)/'`
IN_DIMS=(${IN_RESOLUTION//x/ })
V_TRANSCODE="-c:v libx264 -bsf:v h264_mp4toannexb -preset ${PRESET} \
    tune ${TUNE} -profile:v ${PROFILE}"
V_COPY="-c:v copy -bsf:v h264_mp4toannexb"

if [ "${IN_DIMS[1]}" > "${LINES}" ]; then
    SCALE="-filter:v scale=-1:${LINES} ${OPT_TRANSCODE}"
else
    if ["${IN_CODEC}" != "h264" ]; then
        VIDEO=$OPT_TRANSCODE
    else
        VIDEO=$V_COPY
    fi
fi

exec /usr/bin/ffmpeg -threads `nproc` -i "${1}" $VIDEO $AUDIO $SUBTITLES \
    -f matroska -y "${2}" &> /store/tmp/log

MELAKUKAN:

Buat itu membaca subtitle dari file eksternal jika ditemukan dan menambahkannya ke aliran matroska. Buatlah tidak mentranskode aliran audio jika sudah dalam format yang sesuai.

Emily L.
sumber