NXP i.MX SoC Family/i.MX Linux User`s Guide (IMXLUG)

i.MX Linux User's Guide (IMXLUG) - Multimedia

까마귀75 2023. 2. 24. 12:41
728x90
반응형

[이전] [목차] [다음]

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_pluginavdec_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 플러그인은 여러 비디오를 함께 합성하고 동일한 디스플레이에 렌더링하기 위한 지원을 제공한다. 결과는 다음 이미지와 같다.

Figure 2. Multiple video overlay

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이다.
  • $MUXERqtmux, 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_CAPSvideo/x-raw,format=(string)NV12,width=1920,height=1080,framerate=(fraction)30/1로 설정해야 한다.
  • $MUXERqtmux, 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_CAPSvideo/x-raw, format=(string)NV12, width=1920, height=1080, framerate=(fraction)30/1로 설정해야 한다.
  • $MUXERqtmux, 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-modebuffer로 설정된 경우, 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 패키지가 기본적으로 설치되지 않는다. 다음 단계에 따라 빌드하고 설치한다.

  1. meta-openembedded/meta-multimedia 레이어를 활성화한다:
    $yocto_root/build/conf/bblayers.conf 구성 파일에 BBLAYERS += "${BSPDIR}/sources/meta-openembedded/meta-multimedia" 라인을 추가한다.
  2. 이미지 빌드에 gst-rtsp-server를 포함한다:
    $yocto_root/build/conf/local.conf 구성 파일에 IMAGE_INSTALL:append = " gstreamer1.0-rtsp-server" 라인을 추가한다.
  3. gst-rstp-server와 함께 빌드할 이미지에 대해 bitbake를 실행한다.
  4. 다음 폴더에서 test-uri 바이너리를 찾을 수 있다:
    $yocto_root/build/tmp/work/cortexa9hf-vfp-neon-poky-linuxgnueabi/gstreamer1.0-rtsp-server/$version/build/examples/
  5. 이미지를 플래시한다.
    보드의 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

멀티 채널을 출력해야 하는 보드의 경우에는 멀티 채널 출력 프로필을 활성화하는 데 다음과 같은 단계가 필요하다:

  1. 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>
        ...
        ...
  2. pacmd 커맨드를 사용하여 특정 기능에 대한 프로필을 설정한다.
    $ pacmd set-card-profile $CARD $PROFILE

    $CARDpacmd list-cards에 나열된 카드 이름(예: 위 예시에서 alsa_card.platform-sound-cs42888.34)이고 $PROFILE은 프로필 이름이다. 또한 이들은 pamcd list-cards에 의해 나열된다(예: 위의 예시에서 output:analog-surround-51).
  3. 카드 프로필을 설정한 후, $ pactl list sinks$pacmd set-default-sink $sink-number를 사용하여 기본 싱크를 설정한다.

 

7.5 Installing gstreamer1.0-libav into rootfs

다음 단계는 gstreamer1.0-libav를 rootfs 이미지에 설치하는 방법을 보여준다.

  1. 구성 파일 conf/local.conf에 다음 라인을 추가한다.
    IMAGE_INSTALL:append = " gstreamer1.0-libav"
    LICENSE_FLAGS_ACCEPTED = "commercial"
  2. gstreamer1.0-libav를 빌드한다.
    $ bitbake gstreamer1.0-libav
  3. rootfs 이미지를 빌드한다.
    $ bitbake <image_name>

 

 

[이전] [목차] [다음]

 

 

 

728x90
반응형