Skip to content

Commit

Permalink
Fix: [Server][VideoEncodingTask] FFmpeg では -output_ts_offset ではなく -co…
Browse files Browse the repository at this point in the history
…pyts を使う

HWEncC での --timestamp-passthrough オプションに相当する
  • Loading branch information
tsukumijima committed Nov 24, 2023
1 parent 36d325c commit 5f9182b
Showing 1 changed file with 6 additions and 15 deletions.
21 changes: 6 additions & 15 deletions server/app/streams/VideoEncodingTask.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,14 +77,12 @@ def recorded_video(self) -> RecordedVideo:

def buildFFmpegOptions(self,
quality: QUALITY_TYPES,
output_timestamp_offset: float,
) -> list[str]:
"""
FFmpeg に渡すオプションを組み立てる
Args:
quality (QUALITY_TYPES): 映像の品質
output_timestamp_offset (float): セグメントを出力する際のタイムスタンプ類のオフセット (PTS)
Returns:
list[str]: FFmpeg に渡すオプションが連なる配列
Expand All @@ -95,7 +93,8 @@ def buildFFmpegOptions(self,

# 入力
## -analyzeduration をつけることで、ストリームの分析時間を短縮できる
options.append('-f mpegts -analyzeduration 500000 -i pipe:0')
## -copyts で入力のタイムスタンプを出力にコピーする
options.append('-f mpegts -analyzeduration 500000 -copyts -i pipe:0')

# ストリームのマッピング
## 音声切り替えのため、主音声・副音声両方をエンコード後の TS に含む
Expand Down Expand Up @@ -152,10 +151,6 @@ def buildFFmpegOptions(self,
## 音声が 5.1ch かどうかに関わらず、ステレオにダウンミックスする
options.append(f'-acodec aac -aac_coder twoloop -ac 2 -ab {QUALITY[quality].audio_bitrate} -ar 48000 -af volume=2.0')

# 出力するセグメント TS のタイムスタンプのオフセット
# タイムスタンプが前回エンコードしたセグメントの続きになるようにする
options.append(f'-output_ts_offset {output_timestamp_offset}')

# 出力
options.append('-y -f mpegts') # MPEG-TS 出力ということを明示
options.append('pipe:1') # 標準入力へ出力
Expand Down Expand Up @@ -191,7 +186,8 @@ def buildHWEncCOptions(self,
# 入力
## --input-probesize, --input-analyze をつけることで、ストリームの分析時間を短縮できる
## 両方つけるのが重要で、--input-analyze だけだとエンコーダーがフリーズすることがある
options.append('--input-format mpegts --input-probesize 1000K --input-analyze 0.7 --input -')
## --timestamp-passthrough で入力のタイムスタンプを出力にコピーする
options.append('--input-format mpegts --input-probesize 1000K --input-analyze 0.7 --timestamp-passthrough --input -')
## VCEEncC の HW デコーダーはエラー耐性が低く TS を扱う用途では不安定なので、SW デコーダーを利用する
if encoder_type == 'VCEEncC':
options.append('--avsw')
Expand Down Expand Up @@ -300,9 +296,6 @@ def buildHWEncCOptions(self,
video_width = 1920
options.append(f'--output-res {video_width}x{video_height}')

# 入力のタイムスタンプを出力にコピーする
options.append(f'--timestamp-passthrough')

# 音声
options.append(f'--audio-codec aac:aac_coder=twoloop --audio-bitrate {QUALITY[quality].audio_bitrate}')
options.append('--audio-samplerate 48000 --audio-filter volume=2.0 --audio-ignore-decode-error 30')
Expand Down Expand Up @@ -399,7 +392,7 @@ def __runEncoder(self, segment: VideoStreamSegment) -> None:
if ENCODER_TYPE == 'FFmpeg':

# オプションを取得
encoder_options = self.buildFFmpegOptions(self.video_stream.quality, segment.start_pts / ts.HZ)
encoder_options = self.buildFFmpegOptions(self.video_stream.quality)
Logging.info(f'[Video: {self.video_stream.video_stream_id}][Segment {segment.sequence_index}] '
f'FFmpeg Commands:\nffmpeg {" ".join(encoder_options)}')

Expand All @@ -422,9 +415,7 @@ def __runEncoder(self, segment: VideoStreamSegment) -> None:

# エンコーダープロセスを非同期で作成・実行
self._encoder_process = subprocess.Popen(
[LIBRARY_PATH[ENCODER_TYPE], *encoder_options,
'--log-packets', f'segment_{segment.sequence_index}_in_packets.log',
'--log-mux-ts', f'segment_{segment.sequence_index}_out_muxts.log'],
[LIBRARY_PATH[ENCODER_TYPE], *encoder_options],
stdin = self._tsreadex_process.stdout, # tsreadex からの入力
stdout = subprocess.PIPE, # ストリーム出力
stderr = subprocess.DEVNULL,
Expand Down

0 comments on commit 5f9182b

Please sign in to comment.