7 Multimedia
i.MX는 오디오에 최적화된 소프트웨어 코덱, 파서, 하드웨어 가속 유닛 그리고 관련 플러그인을 제공한다. i.MX는 i.MX 멀티미디어 라이브러리와 하드웨어 가속 유닛에 액세스할 수 있는 GStreamer 플러그인을 제공한다. 이 장에서는 GStreamer 커맨드 라인의 예제와 함께 다양한 멀티미디어 사용 사례를 제공한다.
7.1 i.MX multimedia packages
라이센스 제한으로 인해, i.MX 멀티미디어 페키지는 다음 두 위치에서 찾을 수 있다:
- 표준 패키지: NXP 미러에서 제공된다.
- 제한된 액세스 패키지: 통제된 액세스로 nxp.com에서 제공된다.
자세한 내용은 i.MX Release Notes(IMXLXRN)를 참조한다.
7.2 Building limited access packages
제한된 액세스 패키지를 downloads 디렉토리에 넣고 각 패키지의 readme 파일을 읽는다.
예를 들어, imxcodec-microsoft-$version.tar.gz 패키지는 README-microsoft이다.
7.3 Multimedia use cases
GStreamer는 Linux OS의 기본 멀티미디어 프레임워크이다. 다음 섹션에서는 표시된 특정 기능을 수행하기 위한 GStreamer 커맨드의 예를 제공한다. 다음 테이블은 이 문서에서 공통 기능을 참조하는 방법과 실제 커맨드가 무엇인지 보여준다.
Table 65. Command mapping
Variable | $GSTL | $PLAYBIN | $GPLAY | $GSTINSPECT |
---|---|---|---|---|
GStreamer 1.x | gst-launch-1.0 | playbin | gplay-1.0 | gst-inspect-1.0 |
한 가지 옵션은 다음 예제와 같이 이를 환경 변수로 설정하는 것이다. 시스템에서 커맨드에 대한 전체 경로를 사용한다.
export GSTL=gst-launch-1.0
export PLAYBIN=playbin
export GPLAY=gplay-1.0
export GSTINSPECT=gst-inspect-1.0
이 문서에서 변수는 종종 여러 옵션이 있는 커맨드 파라미터를 설명하는 데 사용된다. 이러한 변수는 사용할 수 있는 값의 유형이 설명되는 $description 형식이다. 가능한 옵션은 i.MX 관련 옵션의 경우 i.MX Linux Release Notes(IMXLXRN)의 Multimedia 섹션에서, 커뮤니티 옵션의 경우 "gstreamer.freedesktop.org/"에서 찾을 수 있다.
GStreamer 커맨드 라인은 다양한 플러그인을 사용해 입력을 파이프로 연결한다. 커맨드 라인의 각 플러그인 섹션은 느낌표(!)로 표시된다. 각 플러그인은 플러그인 이름 뒤와 다음 느낌표(!) 앞에 커맨드 라인에 나타나는 고유한 인수를 가질 수 있다. $GSTINSPECT $plugin을 사용하여 플러그인에 대한 정보와 사용할 수 있는 인수를 가져온다.
대괄호([])는 커맨드 라인의 선택적인 부분을 나타낸다.
7.3.1 Playback use cases
재생 사용 사례를 다음을 포함한다:
- 오디오 전용 재생
- 비디오 전용 재생
- 오디오/비디오 파일 재생
- 기타 재생 방법
7.3.1.1 Audio-only playback
오디오 전용 재생 커맨드는 다음 형식을 사용한다:
$GSTL filesrc location=$clip_name [typefind=true] !
[$id3parse] ! queue ! $audio_parser_plugins
! $audio_decoder_plugin ! $audio_sink_plugin
재생할 파일에 ID3 헤더가 포함되어 있으면 ID3 파서를 사용한다. 파일에 ID3 헤더가 없으면 아무 효과가 없다.
이 예제는 오디오 잭 출력에서 MP3 파일을 재생한다.
$GSTL filesrc location=test.mp3 ! id3demux ! queue !
mpegaudioparse ! beepdec ! pulsesink
7.3.1.2 Video-only playback
$GSTL filesrc location=test.video typefind=true
! $capsfilter ! $demuxer_plugin ! queue max-size-time=0
! $video_decoder_plugin ! $video_sink_plugin
다음은 H.264 인코딩 형식 비디오 파일 재생을 사용하는 MP4 컨테이너의 예이다:
$GSTL filesrc location=test.mp4 typefind=true
! video/quicktime ! aiurdemux ! queue max-size-time=0
! v4l2h264dec ! autovideosink
7.3.1.3 Audio/Video file playback
다음은 오디오와 함께 비디오 파일을 재생하는 커맨드의 예이다:
$GSTL filesrc location=test_file typefind=true ! $capsfilter
! $demuxer_plugin name=demux demux.
! queue max-size-buffers=0 max-size-time=0 !
$video_decoder_plugin
! $video_sink_plugin demux.
! queue max-size-buffers=0 max-size-time=0 !
$audio_decoder_plugin
! $audio_sink_plugin
다음은 AVI 파일의 예이다:
$GSTL filesrc location=test.avi typefind=true ! video/x-msvideo
! aiurdemux name=demux demux.
! queue max-size-buffers=0 max-size-time=0 !
$video_decoder_plugin
! autovideosink demux.
! queue max-size-buffers=0 max-size-time=0 ! beepdec
! alsasink
VPU 하드웨어가 없는 플랫폼의 경우, $video_decoder_plugin은 avdec_h264와 같은 소프트웨어 디코더 플러그인일 수 있다.
7.3.1.4 Multichannel audio playback
PulseAudio가 활성화되었을 때 사용되는 멀티 채널 오디오 재생 설정에 대해서는 Section 7.4를 참조한다.
7.3.1.5 Other methods for playback
미디어 파일 재생을 위해 $PLAYBIN 플러그인이나 i.MX $GPLAY 커맨드 라인 플레이어를 사용한다.
$GSTL $PLAYBIN uri=file:///mnt/sdcard/test.avi
$GPLAY /mnt/sdcard/test.avi
7.3.1.6 Video playback to multiple displays
다중 디스플레이 비디오 재생은 비디오 싱크 플러그인으로 지원할 수 있다. i.MX 8 제품군 SoC에서는 다증 디스플레이 모드용 비디오 싱크가 작동하지 않는다.
이 사용 사례에서는 시스템이 다중 디스플레이 모드(dual/triple/four, 지원되는 디스플레이 수는 SoC와 BSP에 의해 결정)로 부팅해야 한다. 이 모드에서 부팅하도록 시스템을 구성하는 방법은 i.MX Porting Guide(IMXBSPPG)를 참조한다.
7.3.1.6.1 Playing different videos on different displays
서로 다른 디스플레이에서 두 개의 비디오를 재생하는 커맨드 라인은 다음과 같다:
$GSTL $PLAYBIN uri=file:///$file1 $PLAYBIN uri=file:///$file2
video-sink="overlaysink
display-master=false display-slave=true"
7.3.1.6.2 Routing the same video to different displays
다음과 같은 커맨드를 사용하여 비디오를 여러 디스플레이에 표시할 수 있다:
$GSTL $PLAYBIN uri=file:///$filename video-sink="overlaysink
display-slave=true"
7.3.1.6.3 Multiple videos overlay
overlaysink 플러그인은 여러 비디오를 함께 합성하고 동일한 디스플레이에 렌더링하기 위한 지원을 제공한다. 결과는 다음 이미지와 같다.
gst-launch-1.0 playbin uri=file://$FILE1
video-sink="overlaysink overlay-width=512 overlay-height=384"
playbin uri=file://$FILE2 flags=0x41
video-sink="overlaysink overlay-left=512 overlay-width=512 overlay-height=384"
playbin uri=file://$FILE3 flags=0x41
video-sink="overlaysink overlay-top=384 overlay-width=512 overlay-height=384"
playbin uri=file://$FILE4 flags=0x41
video-sink="overlaysink overlay-left=512 overlay-top=384 overlay-width=512 overlay-height=384"
playbin uri=file://$FILE5 flags=0x41
video-sink="overlaysink overlay-left=352 overlay-top=264 overlay-width=320 overlay-height=240 zorder=1"
7.3.2 Audio encoding
다음은 MP3 인코딩에 대한 일부 예제이다.
$GSTL filesrc location=test.wav ! wavparse ! lamemp3enc
! filesink location=output.mp3
7.3.3 Video encoding
다음 커맨드는 VPU 하드웨어로 가속되는 플러그인을 사용하여 일부 미디어 파일을 인코딩하는 방법에 대한 몇 가지 제안을 제공한다(VPU가 있는 SoC에서만 작동).
VPU 비디오 인코딩은 VPU 인코더를 지원하는 SoC에서만 작동한다.
i.MX 6의 경우, 다음 커맨드를 사용한다:
$GSTL filesrc location=test.yuv
! videoparse format=2 witdh=$WIDTH height=$HEIGHT framerate=30/1
! vpuenc_xxx ! $MUXER ! filesink location=$output
i.MX 8M Mini/8M Plus의 경우, 다음 커맨드를 사용한다:
$GSTL filesrc location=test.yuv
! rawvideoparse format=2 witdh=$WIDTH height=$HEIGHT framerate=30/1 colorimetry=bt709
! v4l2xxxenc ! $MUXER ! filesink location=$output
- 대상 인코더 코덱 유형은 다음과 같을 수 있다:
- i.MX 6의 경우, MPEG4, H.263, H.264, MJPEG
- i.MX 8M Mini의 경우, H.264, VP8
- i.MX 8M Plus의 경우, H.264, HEVC
- vpuenc_xxx는 다음과 같을 수 있다:
- i.MX 6의 경우, vpuenc_mpeg4, vpuenc_h263, vpuenc_h264, vpuenc_jpeg
- v4l2xxxenc는 다음과 같을 수 있다:
- i.MX 8M Mini의 경우, v4l2h264enc, v4l2vp8enc
- i.MX 8M Plus의 경우, v4l2h264enc, v4l2h265enc
- i.MX 8QuadMax와 8QuadXPlus에서 VPU 인코더는 v4l2h264enc이다.
- $MUXER는 qtmux, matroskamux, mp4mux, avimux 또는 flvmux로 설정할 수 있다.
- 서로 다른 먹서는 서로 다른 인코딩 코덱 유형을 지원한다. $GSTINSPECT와 $MUXER를 사용하여 사용할 muxer의 기능을 확인한다.
다음 테이블에는 i.MX 8M Mini/8M Plus의 인코딩 비트레이트 모드가 나열되어 있다.
Table 66. Encoding bitrate modes
V4L2_CID_ MPEG_VIDEO_ FRAME_RC_ ENABLE |
Video bitrate mode | Encoded file |
---|---|---|
1 | V4L2_MPEG_VIDEO_BITRATE_MODE_CBR | 비트레이트는 MIN_QP와 MAX_QP에 의해 제한적으로 적용된다. V4L2_CID_MPEG_VIDEO_BITRATE V4L2_CID_MPEG_VIDEO_H264_MIN_QP V4L2_CID_MPEG_VIDEO_H264_MAX_QP |
1 | V4L2_MPEG_VIDEO_BITRATE_MODE_VBR | 위의 경우와 동일하지만, 비트레이트 편차가 더 크다. |
0 | V4L2_MPEG_VIDEO_BITRATE_MODE_CBR / V4L2_MPEG_VIDEO_BITRATE_MODE_VBR |
Qp가 적용된다. V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP |
v4l2xxxenc 뒤에 extra-controls 속성을 사용하여 다른 코덱 컨트롤에 대한 값을 지정한다. v4l2-ctl --device device_path --list-ctrls는 모든 비디오 디바이스의 컨트롤과 해당 값을 보여준다.
예를 들어:
gst-launch-1.0 filesrc location=test.yuv !
rawvideoparse format=2 width=$WIDTH height=
$HEIGHT colorimetry=bt709 ! v4l2h264enc extra-controls="
encode,frame_level_rate_control_enable=1,h264_mb_level_rate_control=filesink location=output.h264
7.3.4 Transcoding
트랜스코딩은 한 비디오 인코딩을 다른 비디오 인코딩으로 변환하는 작업이다.
VPU 비디오 인코딩은 VPU 인코더를 지원하는 SoC에서만 작동한다.
VPU가 포함된 i.MX 6 제품군의 경우, 다음 커맨드를 사용한다:
$GSTL filesrc location=$filename typefind=true ! $capsfilter ! aiurdemux
! vpudec ! imxvideoconvert_ipu ! $CAPS1 ! vpuenc_xxx ! matroskamux ! filesink location=720p.mkv
capsfilter는 컨테이너의 MIME 유형이다. CAPS1은 대상 비디오 해상도이며, vpuenc_xxx는 vpuenc_mpeg4, vpuenc_h263, vpuenc_h264 그리고 vpuenc_jpeg일 수 있다.
예를 들어:
gst-launch-1.0 filesrc location=$FILE.mp4 typefind=true ! video/quicktime ! aiurdemux !
vpudec ! imxvideoconvert_ipu ! video/xraw, format=NV12,width=1280,height=720 ! vpuenc_h264 !
[h264parse] ! matroskamux ! filesink location=$FILE.mkv
i.MX 8QuadMax/8QuadXPlus의 경우, 다음 커맨드를 사용한다:
gst-launch-1.0 filesrc location=$FILE.mp4 typefind=true !
video/quicktime ! aiurdemux ! v4l2h264dec ! queue !
imxvideoconvert_g2d ! queue ! videoconvert ! queue !
v4l2h264enc ! [h264parse] ! matroskamux ! filesink location=$FILE.mkv
i.MX 8M Mini/8M Plus의 경우, 다음 커맨드를 사용한다:
gst-launch-1.0 filesrc location=$FILE.mp4 typefind=true !
video/quicktime ! aiurdemux ! v4l2h264dec ! queue !
v4l2h264enc ! [h264parse] ! matroskamux ! filesink location=$FILE.mkv
참고:
- matroskamux와 같은 일부 mux의 경우, mux 앞에 h264parse/h265parse를 추가한다.
- i.MX 6의 경우, VPU가 AVC와 바이트 스트림 형식을 출력할 수 있으므로 h264parse가 필요하지 않다. i.MX 8의 경우, VPU가 바이트 스트림 출력만 지원하므로 일부 mux 앞에 h264parse/h265parse를 추가해야 한다.
7.3.5 Audio recording
i.MX 8M Plus의 EARC 또는 S/PDIF에서 오디오를 녹음한다.
Multimedia 버전 4.7.0부터 PCM과 압축 형식 eARC 레코딩 파이프라인이 다음 커맨드 라인으로 통합되었다:
gst-launch-1.0 -v alsasrc provide-clock=false device=hw:1,0 !
spdifdemux ! decodebin ! playsink audio-sink="alsasink
device=sysdefault:CARD=wm8960audio buffer-time=40000 sync=false"
참고: imxaudioxcvr 카드 번호는 1이다.
이전 버전과의 호환성을 위해 다음 레거시 파이프라인이 계속 지원된다:
PCM 형식의 경우:
gst-launch-1.0 -v alsasrc device=sysdefault:CARD=imxaudioxcvr
! audio/x-raw,format=S16LE,channels=2,rate=48000 ! playsink
audio-sink="alsasink device=sysdefault:CARD=wm8960audio buffer-time=40000"
압축된 형식의 경우:
gst-launch-1.0 alsasrc device=sysdefault:CARD=imxaudioxcvr !
audio/x-raw,format=S16LE,channels=2,rate=48000 ! queue
max-size-buffers=0 max-size-bytes=0 max-size-time=0 !
spdifdemux ! decodebin ! playsink audio-sink="alsasink
device=sysdefault:CARD=wm8960audio buffer-time=40000 sync=false"
참고:
EARC 모드에서 작업하려면 다음 커맨드를 실행한다.
amixer -c imxaudioxcvr cset numid=1,iface=MIXER,name='XCVR Mode' 'eARC'
다음 예제는 MP3 또는 WMA 오디오 녹음을 만드는 방법을 보여준다.
MP3 녹음의 경우:
$GSTL pulsesrc num-buffers=$NUMBER blocksize=$SIZE ! lamemp3enc ! filesink location=output.mp3
참고:
녹음 기간은 $NUMBER * $SIZE * 8 / (samplerate * channel * bit width)으로 계산된다.
따라서, 샘플레이트가 44.1K이고 폭이 16비트인 스테레오 채널 샘플을 10초간 녹음하려면 다음 커맨드를 사용한다.
$GSTL pulsesrc num-buffers=430 blocksize=4096 ! 'audio/x-raw, rate=44100, channels=2' ! lamemp3enc ! filesink location=output.mp3
7.3.6 Video recording
비디오 녹화는 카메라 입력을 사용하여 수행되므로, 이 동작은 카메라가 있는 플랫폼에만 적용된다. 특수 해상도를 위해 카메라마다 다른 캡처 모드를 설정해야 한다. i.MX BSP Porting Guide(IMXBSPPG)의 Chapter 14 "supporting cameras with CSI" 및 Chapter 15 "supporting cameras with MIPI-CSI"을 참조한다.
VPU 비디오 인코딩은 VPU 인코더를 지원하는 SoC에서만 작동한다. imxv4l2src는 i.MX 6 및 i.MX 7에서만 지원한다. i.MX 8은 오픈 소스 플러그인 v4l2src를 카메라 소스로 지원한다.
$GSTINSPECT 커맨드를 사용하여 코덱 속성에 대한 자세한 정보를 얻을 수 있다.
녹화의 예제는 다음과 같다:
$GSTL $V4L2SRC device=$DEVICE num-buffers=300 ! $INPUT_CAPS !
queue ! $video_encoder_plugin ! [h264parse] ! $MUXER !
filesink location=output.$EXTENSION
- $V4L2SRC는 SoC에 따라 imxv4l2src 또는 v4l2src가 될 수 있다.
- $DEVICE는 시스템의 비디오 입력 디바이스에 따라 /dev/video, /dev/video0 또는 /dev/video1로 설정할 수 있다.
- $INPUT_CAPS는 video/x-raw,format=(string)NV12,width=1920,height=1080,framerate=(fraction)30/1로 설정해야 한다.
- $MUXER는 qtmux, matroskamux, mp4mux, avimux 또는 flvmux로 설정할 수 있다.
- $EXTENSION는 muxer 유형에 따른 파일 이름의 확장자이다.
올바른 $video_encoder_plugin을 선택하려면, Section 7.3.3을 참조한다.
7.3.7 Audio/Video recording
다음은 오디오와 비디오를 함께 녹하는 데 사용되는 커맨드의 예이다:
$GSTL –e $V4L2SRC device=$DEVICE ! $INPUT_CAPS ! queue !
$video_encoder_plugin ! [h264parse] ! queue ! mux. pulsesrc !
'audio/x-raw, rate=44100, channels=2' ! lamemp3enc ! queue !
mux. $MUXER name=mux ! filesink location= output.$EXTENSION
- $V4L2SRC는 SoC에 따라 imxv4l2src 또는 v4l2src가 될 수 있다.
- $INPUT_CAPS는 video/x-raw, format=(string)NV12, width=1920, height=1080, framerate=(fraction)30/1로 설정해야 한다.
- $MUXER는 qtmux, matroskamux, mp4mux, avimux 또는 flvmux로 설정할 수 있다.
올바른 $video_encoder_plugin을 선택하려면, Section 7.3.3을 참조한다.
공통 파라미터는 다음과 같다:
- -e는 출력이 손상되는 것을 방지하기 위해 사용자가 Ctrl+C를 누를 때 EOS를 보내도록 지정한다.
- $EXTENSION는 멀티플렉서 유형에 따른 파일 이름의 확장자이다.
7.3.8 Camera preview
이 예제는 카메라에 보이는 것을 디스플레이한다. 카메라가 있는 플랫폼에서만 사용할 수 있다.
$GSTL v4l2src ! 'video/x-raw, format=(string)$FORMAT,
width=$WIDTH, height=$HEIGHT, framerate=(fraction)30/1' ! v4l2sink
카메라 미리 보기 예제:
$GSTL v4l2src device=/dev/video1 ! 'video/x-raw,
format=(string)UYVY,width=640,height=480,framerate=(fraction)30/1'
! autovideosink
파라미터 설명:
- gst-inspect-1.0 v4l2src를 사용하여 카메라 지원 형식과 해상도를 가져온다.
- 사용자가 다른 형식이나 해상도를 필요로 하는 경우, 카메라의 지원 기능에 따라 caps 필터를 설정한다.
- 올바른 caps 필터가 설정되었는지 확인해야 하며, 이 필터는 v4l2sink에서도 지원해야 한다.
7.3.9 Recording the TV-in source
TV 입력 소스 플러그인은 TV 디코더에서 비디오 프레임을 가져온다. 이는 v4l2 캡처 인터페이스를 기반으로 한다. 커맨드 라인 예제는 다음과 같다:
gst-launch-1.0 v4l2src ! autovideosink
참고:
TV 디코더는 ADV7180이다. NTSC와 PAL TV 모드를 지원한다. 출력 비디오 프레임은 인터레이스이므로 싱크 플러그인에서 디인터레이스를 활성화해야 한다. v4l2sink 디인터레이스의 기본 값은 True이다.
7.3.10 Web camera
다음 커맨드 라인은 웹 카메라 입력을 녹화하고 전송하는 방법의 예제이다.
$GSTL v4l2src device=/dev/video1 ! $video_encoder_plugin !
rtph264pay ! udpsink host=$HOST_IP
HOST_IP는 패킷을 보낼 IP/멀티캐스트 그룹이다.
이 커맨드 라인은 웹 카메라의 입력을 수신하고 디스플레이하는 방법의 예제이다.
$GSTL udpsrc ! buffer-size=204800 (example number) application/
x-rtp ! rtph264depay ! $video_decoder_plugin ! autovideosink
7.3.11 HTTP streaming
HTTP 스트리밍에는 다음을 포함한다:
- 수동 파이프라인
$GSTL souphttpsrc location= http://SERVER/test.avi ! typefind ! aiurdemux name=demux demux. ! queue max-size-buffers=0 max-size-time=0 ! $video_decoder_plugin ! $video_sink_plugin demux. ! queue max-size-buffers=0 max-size-time=0 ! beepdec ! $audio_sink_plugin
- PLAYBIN
$GSTL $PLAYBIN uri=http://SERVER/test.avi
- GPLAY
$GPLAY http://SERVER/test.avi
7.3.12 HTTP live streaming
HLS 스트리밍에는 다음을 포함한다:
- PLAYBIN
$GSTL $PLAYBIN uri=http://SERVER/test.m3u8
- GPLAY
$GPLAY http://SERVER/test.m3u8
7.3.13 MPEG-DASH streaming
MPEG-DASH 스트리밍에는 다음을 포함한다:
- PLAYBIN
$GSTL $PLAYBIN uri=http://SERVER/test.mpd
- GPLAY
$GPLAY http://SERVER/test.mpd
참고:
TS, MP4 그리고 WebM 컨테이너 형식 세그먼트를 지원한다.
7.3.14 Real Time Streaming Protocol (RTSP) playback
GStreamer RTP depacketize(패킷 해제) 플러그인을 보려면 다음 커맨드를 사용한다:
$GSTINSPECT | grep depay
RTSP 스트림은 수동 파이프라인 또는 playbin을 사용하여 재생될 수 있다. 커맨드 형식은 다음과 같다.
- 수동 파이프라인
$GSTL rtspsrc location=$RTSP_URI name=source ! queue ! $video_rtp_depacketize_plugin ! $vpu_dec ! $video_sink_plugin source. ! queue ! $audio_rtp_depacketize_plugin ! $audio_parse_plugin ! beepdec ! $audio_sink_plugin
- PLAYBIN
$GSTL $PLAYBIN uri=$RTSP_URI
RTSP 스트리밍에 유용한 rtspsrc의 두 가지 속성은 다음과 같다:
- Latency: 이 값은 파이프라인의 특별한 추가 지연 시간이며 기본 값은 200ms이다. 지연 시간이 짧은 RTSP 스트리밍 재생이 필요한 경우, 이 속성을 더 작은 값으로 설정한다.
- Buffer-mode: 이 속성은 사용 중인 버퍼링 알고리즘을 컨트롤하는 데 사용된다. 여기에는 네 가지 모드가 있다:
- None: 발신 스탬프는 RTP 타임스탬프에서 직접 계산되므로, 실시간 애플리케이션에는 적합하지 않다.
- Slave: 발신자와 수신자 사이의 오차를 계산하여 지연 시간이 짧은 통신에 적합하도록 부드럽게 조정된 발신 타임스탬프를 생성한다.
- Buffer: 로우 워터마크와 하이 워터마크 사이로 패킷을 버퍼링하여 스트리밍 통신에 적합하다.
- Auto: 스트림에 따라 위의 세 가지 모드를 선택한다. 이것이 기본 설정이다.
RTSP 스트리밍 재생을 일시 중지하거나 다시 시작하려면, buffer-mode=buffer에서와 같이 rtspsrc의 buffer-mode를 slave 또는 none으로 설정한다. 다시 시작하면 타임스탬프는 강제로 0부터 시작되므로, 다시 시작한 후 버퍼가 삭제된다.
수동 파이프라인 예제:
$GSTL rtspsrc location=rtsp://10.192.241.11:8554/test name=source
! queue ! rtph264depay ! avdec_h264 ! overlaysink source.
! queue ! rtpmp4gdepay ! aacparse ! beepdec ! pulsesink
rtspsrc 플러그인에서 buffer-mode가 buffer로 설정된 경우, GStreamer 1.x에서 재생이 자동으로 종료되지 않는다.
7.3.15 RTP/UDP MPEGTS streaming
RTP/UDP MPEGTS 스트리밍을 수행할 때 유의해야 할 몇 가지 사항이 있다:
- UDP/RTP 서버가 전송하는 소스 파일은 TS 형식이어야 한다.
- 클라이언트 시작 시간보다 1초 먼저 서버를 시작한다.
- UDP/RTP TS 스트리밍에 유용한 aiurdemux의 두 가지 속성은 다음과 같다:
streaming-latency: 이는 파이프 라인의 특별한 추가 지연 시간이며, 기본값은 400ms이다. 이 값은 클라이언트가 먼저 시작되는 상황을 고려하여 디자인되었다. 값이 너무 작으면 오디오 또는 비디오 버퍼 부족으로 인해 전체 파이프라인이 실행되지 않을 수 있다. 이 경우 현재 커맨드를 취소하고 파이프라인을 다시 시작해야 한다. 값이 너무 크면 서버를 시작한 후 동영상을 확인하기 위해 오랜 시간 기다려야 한다.
low_latency_tolerance: 이 값은 스트리밍 지연 시간에서 총 지연 시간이 지터링될 수 있는 범위이다. 이 속성은 기본적으로 비활성화되어 있다. 사용자가 이 값을 설정하면, 최대 지연 시간은 (streaming-latency + low_latency_tolerance)가 된다.
UDP MPEGTS 스트리밍 커맨드 라인 형식은 다음과 같다:
$GSTL udpsrc do-timestamp=false uri=$UDP_URI caps="video/mpegts"
! aiurdemux streaming_latency=400 name=d d. ! queue ! $vpu_dec
! queue ! $video_render_sink sync=true d. ! queue ! beepdec ! $audio_sink_plugin sync=true
$GSTL udpsrc do-timestamp=false uri=udp://10.192.241.255:10000 caps="video/mpegts"
! aiurdemux streaming_latency=400 name=d d. ! queue ! vpudec
! queue ! overlaysink sync=true d. ! queue ! beepdec ! pulsesink sync=true
RTP MPEGTS 스트리밍 커맨드의 형식은 다음과 같다:
$GSTL udpsrc do-timestamp=false uri=$RTP_URI caps="application/x-rtp"
! rtpmp2tdepay ! aiurdemux streaming_latency=400 name=d d. ! queue ! $vpu_dec
! queue ! $video_render_sink sync=true d. ! queue ! beepdec ! $audio_sink_plugin sync=true
$GSTL udpsrc do-timestamp=false uri=udp://10.192.241.255:10000 caps="application/x-rtp"
! rtpmp2tdepay ! aiurdemux streaming_latency=400 name=d d.
! queue ! vpudec ! queue ! overlaysink sync=true d. ! queue ! beepdec
! pulsesink sync=true
7.3.16 RTSP streaming server
RTSP 스트리밍 서버 사용 사례는 오픈 소스 gst-rtsp-server 패키지를 기반으로 한다. 이 서버는 i.MX aiurdemux 플러그인을 사용하여 파일을 오디오 또는 비디오 기본 스트림으로 디멀티플렉스하고 RTP를 통해 전송한다. 한 보드에서 RTSP 스트리밍 서버를 시작하고,다른 보드에서 RTSP 스트리밍 재생 커맨드를 사용하여 재생한다.
Yocto Project 릴리스에서는 gst-rtsp-server 패키지가 기본적으로 설치되지 않는다. 다음 단계에 따라 빌드하고 설치한다.
- meta-openembedded/meta-multimedia 레이어를 활성화한다:
$yocto_root/build/conf/bblayers.conf 구성 파일에 BBLAYERS += "${BSPDIR}/sources/meta-openembedded/meta-multimedia" 라인을 추가한다. - 이미지 빌드에 gst-rtsp-server를 포함한다:
$yocto_root/build/conf/local.conf 구성 파일에 IMAGE_INSTALL:append = " gstreamer1.0-rtsp-server" 라인을 추가한다. - gst-rstp-server와 함께 빌드할 이미지에 대해 bitbake를 실행한다.
- 다음 폴더에서 test-uri 바이너리를 찾을 수 있다:
$yocto_root/build/tmp/work/cortexa9hf-vfp-neon-poky-linuxgnueabi/gstreamer1.0-rtsp-server/$version/build/examples/
- 이미지를 플래시한다.
보드의 rootfs에 있는 /usr/bin에 test-uri를 복사하고 실행 권한을 부여한다.
도구 실행에 대한 몇 가지 정보는 다음과 같다:
- 커맨드:
test-uri $RTSP_URI
예를 들어:
test-uri file:///home/root/temp/TestSource/mp4/1.mp4
- 서버 주소:
rtsp://$SERVER_IP:8554/test
예를 들어:
rtsp://10.192.241.106:8554/test
- 지원되는 클라이언트 작업은 Play, Stop, Pause, Resume 그리고 Seek이다.
7.3.17 Video conversion
비디오 변환 플러그인에는 imxvideoconvert_ipu, imxvideoconvert_g2d 그리고 imxvideoconvert_pxp 세 가지가 있다. 모두 비디오 색 공간 변환, 크기 조정 그리고 회전을 수행하는 데 사용할 수 있다. imxvideoconvert_ipu는 비디오 디인터레이싱을 수행하는 데에도 사용할 수 있다. 이 플러그인들은 X Windows에서 비디오 렌더링을 활성화하거나 비디오 크기, 회전 또는 디인터레이싱을 변경하여 트랜스코딩에 사용하려고 ximagesink 전에 연결하여 사용할 수 있다.
각 컨버터의 기능과 지원되는 입력과 출력 형식을 가져오기 위해 gst-inspect-1.0를 사용한다. imxvideoconvert_g2d는 색상 공간을 RGB 공간으로만 변환할 수 있다.
Color Space Conversion (CSC)
gst-launch-1.0 videotestsrc ! video/x-raw,format=NV12 !
imxvideoconvert_{xxx} ! video/x-raw,format=RGB16 ! ximagesink display=:0
Resize
gst-launch-1.0 videotestsrc ! video/xraw,
format=NV12,width=800,height=600 ! imxvideoconvert_{xxx} !
video/x-raw, width=640, height=480 ! ximagesink display=:0
Rotate
gst-launch-1.0 videotestsrc ! imxvideoconvert_{xxx}
rotation=2 ! ximagesink display=:0
Video crop with i.MX with G2D
gst-launch-1.0 videotestsrc ! videocrop top=10 bottom=10
right=10 left=10 !imxvideoconvert_g2d videocrop-metaenable=
true ! queue ! ximagesink display=:0
Deinterlacing with i.MX with IPU
gst-launch-1.0 playbin uri=file://$FILE videosink="
imxvideoconvert_ipu deinterlace=3 ! ximagesink display=:0 sync=false"
Transcoding with i.MX with VPU
gst-launch-1.0 filesrc location=$FILE.mp4 typefind=true !
video/quicktime ! aiurdemux ! vpudec ! imxvideoconvert_ipu !
video/x-raw,format=NV12,width=1280,height=720 ! vpuenc_h263 !
avimux ! filesink location=$FILE.avi
Combination with i.MX with IPU or VPU
CSC, 크기 조정, 회전 그리고 디인터레이스를 한 번에 결합할 수 있다. imxvideoconvert_ipu와 imxvideoconvert_g2d 모두 파이프라인에서 동시에 사용할 수 있다. 다음은 예시이다:
gst-launch-1.0 videotestsrc ! video/xraw,format=I420,width=1280,height=800,interlacemode=interleaved
! imxvideoconvert_ipu rotation=2 deinterlace=3
! video/x-raw,format=NV12,width=800,height=600
! vpuenc_h264 ! vpudec ! imxvideoconvert_g2d rotation=3
! video/x-raw,format=RGB16,width=640,height=480
! ximagesink sync=false display=:0
7.8.18 Video composition
imxcompositor_g2d는 해당 하드웨어를 사용하여 비디오 구성을 가속화한다. 여러 비디오를 하나로 합성하는 데 사용할 수 있다. 비디오 위치, 크기 그리고 회전은 구성하는 동안 지정할 수 있다. 입력 비디오와 출력 비디오가 동일하지 않은 경우, 비디오 색 공간 변환도 자동으로 수행된다. 각 비디오는 알파 블렌딩과 비디오 블렌딩 시퀀스를 얻기 위해 alpha와 z-order 값으로 설정될 수 있다.
imxcompositor_g2d는 RGB 색상 공간 형식만 출력할 수 있다. 지원되는 입력과 출력 비디오 형식을 포함하여 자세한 정보를 얻으려면 gst-inspect-1.0을 사용한다.
Composite two videos into one
gst-launch-1.0 imxcompositor_{xxx} name=comp sink_1::xpos=160
sink_1::ypos=120 ! overlaysink videotestsrc ! comp.sink_0
videotestsrc ! comp.sink_1
Composite two videos into one with red background color
gst-launch-1.0 imxcompositor_{xxx} background=0x000000FF
name=comp sink_1::xpos=160 sink_1::ypos=120 ! overlaysink
videotestsrc ! comp.sink_0 videotestsrc ! comp.sink_1
Composite two videos into one with CSC, resize, and rotate
gst-launch-1.0 imxcompositor_{xxx} name=comp sink_0::width=640 sink_0::height=480
sink_1::xpos=160 sink_1::ypos=120 sink_1::width=640 sink_1::height=480 sink_1::rotate=1 !
video/x-raw,format=RGB16 ! overlaysink videotestsrc !
video/x-raw,format=NV12,width=320,height=240 !
comp.sink_0 videotestsrc !
video/x-raw,format=I420,width=320,height=240 !
comp.sink_1
Composite three videos into one with CSC, resize, rotate, alpha, z-order, and keep aspect ratio
gst-launch-1.0 imxcompositor_{xxx} name=comp
sink_0::width=640 sink_0::height=480 sink_0::alpha=0.5 sink_0::z-order=3
sink_1::alpha=0.8 sink_1::z-order=2
sink_1::xpos=160 sink_1::ypos=120 sink_1::width=640 sink_1::height=480 sink_1::rotate=1
sink_2::xpos=320 sink_2::ypos=240 sink_2::width=500 sink_2::height=500 sink_2::alpha=0.6
sink_2::keep-ratio=true !
video/x-raw,format=RGB16 ! overlaysink videotestsrc !
video/x-raw,format=NV12,width=320,height=240 ! comp.sink_0 videotestsrc !
video/x-raw,format=I420,width=320,height=240 ! comp.sink_1 videotestsrc !
video/x-raw,format=RGB16,width=320,height=240 ! comp.sink_2
7.4 PulseAudio input/output settings
PulseAudio가 rootfs에 설치된 경우, PulseAudio 입력/출력 설정을 설정해야 할 수 있다.
Audio output settings
pactl 커맨드를 사용하여 사용 가능한 모든 오디오 싱크를 나열한다:
$ pactl list sinks
사용 가능한 오디오 싱크 목록이 표시된다:
Sink #0
State: SUSPENDED
Name: alsa_output.platform-soc-audio.1.analog-stereo
Description: sgtl5000-audio Analog Stereo
...
...
Sink #1
State: SUSPENDED
Name: alsa_output.platform-soc-audio.4.analog-stereo
Description: imx-hdmi-soc Analog Stereo
...
...
pacmd 커맨드를 사용하여 위에 표시된 목록의 싱크 번호에 따라 기본 오디오 싱크를 설정한다:
$ pacmd set-default-sink $sink-number
$sink-number는 위에 예시에서 0 또는 1일 수 있다.
기본 싱크를 설정한 후, 아래 커맨드를 사용하여 오디오 경로를 확인한다:
$ gst-launch audiotestsrc ! pulsesink
Audio input settings
pactl 커맨드를 사용하여 사용 가능한 모든 오디오 소스를 나열한다:
$ pactl list sources
사용 가능한 오디오 소스 목록이 표시된다:
Source #0
State: SUSPENDED
Name: alsa_output.platform-soc-audio.1.analog-stereo.monitor
Description: Monitor of sgtl5000-audio Analog Stereo
...
...
Source #1
State: SUSPENDED
Name: alsa_input.platform-soc-audio.1.analog-stereo
Description: sgtl5000-audio Analog Stereo ...
...
...
pacmd 커맨드를 사용하여 위에 표시된 목록의 소스 번호에 따라 기본 오디오 소스를 설정한다:
$ pacmd set-default-source $source-number
$source-number는 위의 예시에서 0 또는 1일 수 있다. 녹화와 재생이 동시에 필요하지 않은 경우에는 모니터 모드를 설정할 필요가 없다.
PulseAudio I/O 경로 설정 상태는 다음과 같이 확인할 수 있다:
$ pactl stat
Multichannel output support settings
멀티 채널을 출력해야 하는 보드의 경우에는 멀티 채널 출력 프로필을 활성화하는 데 다음과 같은 단계가 필요하다:
- pacmd 커맨드를 사용하여 사용 가능한 카드를 나열한다:
$ pacmd list-cards
사용 가능한 사운드 카드와 지원되는 프로필이 나열된다.
2 card(s) available. index: 0 name: <alsa_card.platform-sound-cs42888.34> driver: <module-alsa-card.c> owner module: 6 properties: alsa.card = "0" alsa.card_name = "cs42888-audio" ... ... profiles: input:analog-mono: Analog Mono Input (priority 1, available: unknown) input:analog-stereo: Analog Stereo Input (priority 60, available: unknown) ... ... active profile: <output:analog-stereo+input:analog-stereo> ... ...
- pacmd 커맨드를 사용하여 특정 기능에 대한 프로필을 설정한다.
$ pacmd set-card-profile $CARD $PROFILE
$CARD는 pacmd list-cards에 나열된 카드 이름(예: 위 예시에서 alsa_card.platform-sound-cs42888.34)이고 $PROFILE은 프로필 이름이다. 또한 이들은 pamcd list-cards에 의해 나열된다(예: 위의 예시에서 output:analog-surround-51). - 카드 프로필을 설정한 후, $ pactl list sinks와 $pacmd set-default-sink $sink-number를 사용하여 기본 싱크를 설정한다.
7.5 Installing gstreamer1.0-libav into rootfs
다음 단계는 gstreamer1.0-libav를 rootfs 이미지에 설치하는 방법을 보여준다.
- 구성 파일 conf/local.conf에 다음 라인을 추가한다.
IMAGE_INSTALL:append = " gstreamer1.0-libav" LICENSE_FLAGS_ACCEPTED = "commercial"
- gstreamer1.0-libav를 빌드한다.
$ bitbake gstreamer1.0-libav
- rootfs 이미지를 빌드한다.
$ bitbake <image_name>
'NXP i.MX SoC Family > i.MX Linux User`s Guide (IMXLUG)' 카테고리의 다른 글
i.MX Linux User's Guide (IMXLUG) - Graphics (0) | 2023.03.10 |
---|---|
i.MX Linux User's Guide (IMXLUG) - Audio (0) | 2023.03.06 |
i.MX Linux User's Guide (IMXLUG) - Power Management (0) | 2023.02.24 |
i.MX Linux User's Guide (IMXLUG) - Enabling Solo Emulation (0) | 2023.02.24 |
i.MX Linux User's Guide (IMXLUG) - Booting Linux OS (0) | 2023.02.02 |