
라이브 MPEG-TS 스트림에 연결하고 이를 MPEG-DASH로 변환하는 ffmpeg에 공급하는 프로그램이 있습니다.
입력 TS에는 3개의 오디오 PID가 있습니다. (정확한 오디오 PID는 프로그램 ID와 스트림 소스에 따라 다르므로 명령줄에 하드 코딩할 수 없습니다.) 예를 들어:
0x67 Spanish Dubbed Audio "spa/Main Audio"
0x68 Original Audio "qaa/Main Audio"
0x69 Descriptive Audio for visually impaired
웹 브라우저에서 를 사용하는 플레이어 dash.js
에는 선택할 오디오 트랙을 선택할 수 있는 메뉴가 있습니다.
그러나 MPEG-TS 스트림에 연결되는 시기에 따라 ffmpeg는 오디오를 서로 다르며 겉보기에 무작위인 순서로 열거합니다. 오디오 트랙이 "입력 스트림" 인덱스를 오름차순으로 출력에 할당된 것 같습니다. 예를 들어:
Output Stream mapping:
Stream #0:18 (mpeg2video) -> scale (graph 0)
scale (graph 0) -> Stream #0:0 (libx264)
Stream #0:9 -> #0:1 (mp2 (native) -> aac (native))
Stream #0:13 -> #0:2 (mp2 (native) -> aac (native))
Stream #0:17 -> #0:3 (mp2 (native) -> aac (native))
입력을 스캔한 후 spa/spa/qaa를 할당합니다.
Stream #0:9[0x67](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
Stream #0:13[0x69](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, fltp, 96 kb/s (visual impaired) (descriptions)
Stream #0:17[0x68](qaa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s
몇 번 더 실행하면 입력 감지가 항상 달라집니다.
Stream #0:8[0x69](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, fltp, 96 kb/s (visual impaired) (descriptions)
Stream #0:15[0x68](qaa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s
Stream #0:17[0x67](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
Stream #0:10[0x68](qaa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s
Stream #0:17[0x67](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
Stream #0:22[0x69](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, fltp, 96 kb/s (visual impaired) (descriptions)
ffmpeg
입력-출력의 일관된 매핑을 생성하려면 어떻게 해야 합니까 ? 이상적으로는 증분 PID 번호를 기준으로 합니다.
편집 I
나는 그것이 내 질문과 실제로 관련이 있다고 생각하지 않지만 관심 있는 사람들을 위한 명령줄은 다음과 같습니다... ffmpeg
파이프에서 읽습니다. 파이프는 피드를 받는 내 프로그램에 의해 작성됩니다.
ffmpeg -re -f mpegts -i pipe:10 -ignore_unknown \
-map 0:p:510 -map -0:s -map -0:d \
-filter_complex [p:510:v]scale=640:-1 -r 25 -force_key_frames expr:gte(t,n_forced*1) \
-c:v libx264 -b:v 1M -x264-params scenecut=0 -threads 2 \
-c:a aac -b:a 64k -ac 2 \
-f dash -dash_segment_type mp4 -movflags +delay_moov \
-seg_duration 2.000000 -frag_type duration -frag_duration 0.200000 \
-index_correction 1 -target_latency 5 -window_size 10 -extra_window_size 5 \
-remove_at_exit 1 -streaming 1 -ldash 1 -use_template 1 -use_timeline 0 \
-write_prft 1 -avioflags direct -fflags +nobuffer+flush_packets \
-format_options movflags=+cmaf -utc_timing_url \
/web/be/time.php /var/ott/session_9733/master.mpd'
답변1
MPEG-TS는 전송 스트림, 즉 흐르는 스트림이므로 스트림 순서는 디먹싱기가 PES 패킷을 만나는 순서에 따라 설정됩니다. 이는 변경할 수 없습니다.
당신이 할 수 있는 일은 현재의 포지티브 맵을 -map 0:p:510
다음으로 바꾸는 것입니다.-map 0:p:510:v -map 0:p:510:a:m:language:qaa -map 0:p:510:a:m:language:spa
작업할 MPTS 피드가 없으므로 현재 구문을 확인할 수 없습니다.
답변2
Gyan의 답변에서 ffmpeg
스트림을 보는대로 열거합니다. 따라서 MPTS(다중 프로그램 전송 스트림)에서는 스트림을 쉽게 선택할 수 있는 방법이 없습니다.그리고PID 번호를 기준으로 스트림의 특정 순서를 적용합니다.
따라서 프로그램은 먼저 TS를 독립적으로 스캔하여 비디오 및 오디오 PID 목록을 작성해야 합니다. 그런 다음 루프에서 해당 PID를 사용하여 ffmpeg
명령줄을 구성합니다.
구성된 명령줄은 다음과 같습니다.
ffmpeg -re -loglevel verbose \
-f mpegts -i inputFile.ts -ignore_unknown \
-map 0:v:i:101 \
-map 0:a:i:103 -metadata:s:a:0 title='Main' \
-map 0:a:i:104 -metadata:s:a:1 title='Main' \
-map 0:a:i:105 -metadata:s:a:2 title='Visual impaired commentary' \
-map -0:s -map -0:d \
-filter_complex [p:510:v]scale=640:-1 \
-r 25 -force_key_frames expr:gte\(t,n_forced*1\) \
-c:v libx264 -b:v 1M -x264-params scenecut=0 \
-threads 2 -c:a aac -b:a 64k -ac 2 \
-f dash -dash_segment_type mp4 -movflags +delay_moov -seg_duration 2.000000 \
-frag_type duration -frag_duration 0.200000 -index_correction 1 \
-target_latency 5 -window_size 10 -extra_window_size 5 -remove_at_exit 1 \
-streaming 1 -ldash 1 -use_template 1 -use_timeline 0 -write_prft 1 \
-avioflags direct -fflags +nobuffer+flush_packets -format_options movflags=+cmaf \
-utc_timing_url /time.php \
/tmp/master.mpd