Matroska कंटेनर में H264 + AAC के लिए रियलटाइम ट्रांसकोडिंग


2

परिदृश्य

मेरे पास एक मूवी लाइब्रेरी है जिसे मैं प्लेबैक के लिए वीएलसी का उपयोग करके अपने एंड्रॉइड टैबलेट के लिए सुव्यवस्थित बनाने के लिए देख रहा हूं। मैं मोबाइल इंटरनेट कनेक्शन पर सर्वोत्तम संभव दृश्य गुणवत्ता के लिए H264 + AAC का उपयोग करना चाहता हूं। मैं एक Matroska कंटेनर का उपयोग करने की भी इच्छा रखता हूं जो कि बिटमैप उपशीर्षक के विपरीत टेक्स्ट उपशीर्षक का समर्थन करता है जो MPEG2TS का समर्थन करता है।

मैंने मेडियाटॉम्ब स्थापित किया है और UPnP काम कर रहा है जैसा कि मुझे करना चाहिए, मैं ट्रांसकोडिंग के बिना वीडियो और ऑडियो ठीक कर सकता हूं।

मुसीबत

मैं ट्रांसकोड और downsample mpeg2 करने के लिए बस ठीक कर सकते हैं। लेकिन H264 प्लेबैक किसी भी एक वीडियो के लिए हर बार एक ही जगह पर 10-40 सेकंड के बाद रुक जाता है लेकिन हर वीडियो के लिए अलग-अलग जगह होता है। प्लेबैक पीसी पर वीएलसी पर भी शुरू नहीं होता है (पहले फ्रेम के बाद बंद हो जाता है)।

कॉन्फ़िगरेशन

मैं इस स्क्रिप्ट का उपयोग कर रहा हूं

#!/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

संबंधित अनुभाग के साथ मेरा मीडियम गर्भ विन्यास:

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

यदि मैं करूं तो tail -f /store/tmp/logमैं देख सकता हूं कि टैबलेट पर प्लेबैक रुकने के बाद भी FFMPEG प्रोसेस एन्कोडिंग है। वास्तव में, यह बहुत खुशी से चबा रहा है। और यह एक ऐसी दर पर एन्कोडिंग है जो स्रोत सामग्री की तुलना में तेज़ है इसलिए यह पीछे नहीं है। टेबलेट पर प्लेबैक तब तक सुचारू है जब तक कि यह अचानक बंद न हो जाए।

मैंने अलग-अलग प्रीसेट, प्रोफाइल और ट्यून पैरामेट्स का उपयोग करने की कोशिश की है, कोई फायदा नहीं हुआ, जब तक कि फ्रीज नहीं होता है, तो यह विपरीत रूप से आनुपातिक लगता है कि एनकोडर कितनी तेजी से चल रहा है (उच्च एन्कोडिंग गति, फ्रीज करने के लिए कम समय)

जवाबों:


4

H264 स्ट्रीम को स्ट्रीम करने योग्य बनाने के लिए समायोजित करें:

जाहिरा तौर पर h264 कोडेक के पास एक विशेष मोड है जो इसे कुशलता से सुव्यवस्थित करने के लिए आवश्यक है और आप इसे इसके साथ सक्षम करते हैं: -bsf:v h264_mp4toannexb

लिपि

स्क्रिप्ट मैं एक H264 + AAC matroska स्ट्रीमिंग पाइप को सेटअप करने के लिए उपयोग करता हूं यह है:

#!/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

करने के लिए:

यदि यह पाया जाता है तो इसे बाहरी फ़ाइलों से सबटाइटल्स पढ़ें और उन्हें मैट्रोज़्का स्ट्रीम में जोड़ें। यदि यह पहले से ही एक उपयुक्त प्रारूप में है तो इसे ऑडियो स्ट्रीम में ट्रांसकोड न करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.