ffplay를 이용한 영상 재생 시험
Windows 10 환경에서 영상 스트리밍 재생 시험을 위해 ffplay.exe설치 및 기본 사용 방법을 알아본다.
물론 VLC나 MPC-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
- ffplay Documentation
- ffmpeg Windows Builds 다운로드
- FFplay 문서 번역
- How to minimize the delay in a live streaming with ffmpeg
- ffplay.exe- change playback speed without re-encoding
- ffplay.exeprotocol whitelist
- TEST AUDIO AND VIDEO CLIPS