ffplay를 이용한 영상 재생 시험

ffplay를 이용한 영상 재생 시험

2020, Oct 24    

Windows 10 환경에서 영상 스트리밍 재생 시험을 위해 ffplay.exe설치 및 기본 사용 방법을 알아본다.

물론 VLCMPC-BE와 같은 범용 플레이어를 이용할 수도 있지만 ffmpeg을 이용해서 관련 개발을 할 경우 빌드 버전에 따라 동작이 다른 경우가 있어 빌드 버전에 맞는 플레이어로 시험을 진행하기로 한다.

ffplay.exe?

FFplay is a very simple and portable media player using the FFmpeg libraries and the SDL library.
It is mostly used as a testbed for the various FFmpeg APIs.

ffmpeg 빌드 다운로드

FFmpeg Windows Builds 페이지에서 Windows용 빌드버전을 다운로드 할 수 있다.

필요에 따라 4가지의 빌드를 제공하는데 최신 릴리즈 버전을 다운로드 한다.

Invoke-WebRequest -Uri https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full.7z -OutFile ffmpeg-release-full.7z

7z 파일을 풀면 bin 디렉토리 아래 3개의 바이너리가 있고 “ffplay.exe” 파일을 이용한다.

2018-09-21  오전 03:18        61,157,376 ffmpeg.exe
2018-09-21  오전 03:18        61,044,736 ffplay.exe
2018-09-21  오전 03:18        61,067,776 ffprobe.exe

Windows Terminal 에서 실행 방법

-rtsp_transport tcp 옵션으로 TCP 또는 UDP로 재생 할 수 있음. -ss 120 : 120 초로 이동하여 재생.

ffplay.exe -rtsp_transport tcp "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov" -ss 120

ffplay.exeversion 4.3.1-2020-10-01-full_build-www.gyan.dev Copyright (c) 2003-2020 the FFmpeg developers
  built with gcc 10.2.0 (Rev3, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, rtsp, from 'rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov':
  Metadata:
    title           : BigBuckBunny_115k.mov
  Duration: 00:09:56.48, start: 0.000000, bitrate: N/A
    Stream #0:0: Audio: aac (LC), 12000 Hz, stereo, fltp
    Stream #0:1: Video: h264 (Constrained Baseline), yuv420p(progressive), 240x160, 24 fps, 24 tbr, 90k tbn, 48 tbc

RTSP METHOD를 보면 아래와 같다.

OPTIONS "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_175k.mov" RTSP/1.0
CSeq: https://www.radiantmediaplayer.com/media/big-buck-bunny-360p.mp41
User-Agent: Lavf58.12.100

DESCRIBE "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_175k.mov" RTSP/1.0
Accept: application/sdp
CSeq: 2
User-Agent: Lavf58.12.100

SETUP "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_175k.mov" RTSP/1.0
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
CSeq: 3
User-Agent: Lavf58.12.100

PLAY "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_175k.mov" RTSP/1.0
Range: npt=0.000-
CSeq: 4
User-Agent: Lavf58.12.100
Session: 5BD1B5B1

PAUSE "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_175k.mov" RTSP/1.0
CSeq: 5
User-Agent: Lavf58.12.100
Session: 5BD1B5B1

PLAY "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_175k.mov" RTSP/1.0
Range: npt=119.978-
CSeq: 6
User-Agent: Lavf58.12.100
Session: 5BD1B5B1

Options

ffplay를 이용해서 특정 위치에서 재생하기 위한 옵션 -ss position

2.3.1 Examples
The following examples are all valid time duration:

‘55’
55 seconds

‘12:03:45’
12 hours, 03 minutes and 45 seconds

‘23.189’
23.189 seconds

Seek 를 위한 Range 정의

일반적으로 플레이어에서 seek를 제공하려면 SDP에 range가 있어야 하고 range 정의는 아래와 같다.

C.1.5 Range of presentation

   The "a=range" attribute defines the total time range of the stored
   session. (The length of live sessions can be deduced from the "t" and
   "r" parameters.) Unless the presentation contains media streams of
   different durations, the range attribute is a session-level
   attribute. The unit is specified first, followed by the value range.
   The units and their values are as defined in Section 3.5, 3.6 and
   3.7.

   Examples:
     a=range:npt=0-34.4368
     a=range:clock=19971113T2115-19971113T2203

“ffprobe.exe”도구로 Duration 정보를 확인할 수 있다.

PS > ffprobe.exe rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_175k.mov
. . .
Input #0, rtsp, from 'rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_175k.mov':
  Metadata:
    title           : BigBuckBunny_175k.mov
  Duration: 00:09:56.46, start: 0.000000, bitrate: N/A
    Stream #0:0: Audio: aac (LC), 48000 Hz, stereo, fltp
    Stream #0:1: Video: h264 (Constrained Baseline), yuv420p(progressive), 240x160, 24 fps, 24 tbr, 90k tbn, 48 tbc

디코딩 코덱 설정

nVidoa Geforce의 하드웨어 가속을 사용하기 위해 cuvid 옵션을 사용한다.

-vcodec h264_cuvid

실행시 해상도 및 버퍼 설정

-probesize 40 : 지연을 최소화 하기 위한 버퍼 사이즈 설정 -x 1280 -y 720 : 재생시 해상도 설정.

ffplay.exe -probesize 40 -x 1280 -y 720 rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_175k.mov

재생 속도 설정

재생속도 시험을 위해 PTS 를 조절한다. 물론 스트리밍서버에서 해당 속도로 데이타를 전송히야 한다.

ffplay.exe -vf "setpts=0.5*PTS" file

화면 재생없이 테스트 옵션

-nodisp

HTTP 스트리밍 재생

m3u8 를 재생할 때 whitelist 관련 오류가 발생하면 -protocol_whitelist 옵션 추가.

PS > ffplay.exe -protocol_whitelist file,http,https,tcp,tls,crypto -i .\bunny.m3u8

bunny.m3u8 내용은 아래와 같다.

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=391416,AVERAGE-BANDWIDTH=378444,CODECS="avc1.4d4020,mp4a.40.5",RESOLUTION=360x360,FRAME-RATE=30.000
https://v.pinimg.com/videos/mc/hls/78/03/97/780397d6383a130903971c6f49a2f92b_360w.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=271096,AVERAGE-BANDWIDTH=266020,CODECS="avc1.4d4020,mp4a.40.5",RESOLUTION=240x240,FRAME-RATE=30.000
https://v.pinimg.com/videos/mc/hls/78/03/97/780397d6383a130903971c6f49a2f92b_240w.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=491808,AVERAGE-BANDWIDTH=484664,CODECS="avc1.4d4020,mp4a.40.5",RESOLUTION=480x480,FRAME-RATE=30.000
https://v.pinimg.com/videos/mc/hls/78/03/97/780397d6383a130903971c6f49a2f92b_480w.m3u8

참고 URL