ffmpeg浅易播放器的完成-音视频播放_玖富娱乐主管


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

基于FFmpeg和SDL完成的浅易视频播放器,主要分为读取视频文件解码和挪用SDL显现两大局部。
前面两个试验离别完成了视频播放和音频播放:
FFmpeg浅易播放器的完成-视频播放
FFmpeg浅易播放器的完成-音频播放
本试验将视频播放和音频播放连系在一同。
本试验主要参考以下两篇文章:
[1]. 最简朴的基于FFMPEG SDL的视频播放器ver2(接纳SDL2.0)
[2]. An ffmpeg and SDL Tutorial

1. 视频播放器基本原理

下图援用自“雷霄骅,视音频编解码手艺零基本学习方法”,因原图太小,看不太清晰,故从新制作了一张图片。

以下内容援用自“雷霄骅,视音频编解码手艺零基本学习方法”:

解协定
将流媒体协定的数据,剖析为规范的响应的封装花样数据。视音频在收集上流传的时刻,经常接纳种种流媒体协定,比方HTTP,RTMP,或是MMS等等。这些协定在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包孕对播放的掌握(播放,停息,住手),或许对收集状况的形貌等。解协定的历程当中会去撤除信令数据而只保存视音频数据。比方,接纳RTMP协定传输的数据,经由解协定操纵后,输出FLV花样的数据。

解封装
将输入的封装花样的数据,星散成为音频流紧缩编码数据和视频流紧缩编码数据。封装花样品种许多,比方MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已紧缩编码的视频数据和音频数据依照肯定的花样放到一同。比方,FLV花样的数据,经由解封装操纵后,输出H.264编码的视频码流和AAC编码的音频码流。

解码
将视频/音频紧缩编码数据,解码成为非紧缩的视频/音频原始数据。音频的紧缩编码规范包罗AAC,MP3,AC-3等等,视频的紧缩编码规范则包罗H.264,MPEG2,VC-1等等。解码是全部体系中最主要也是最庞杂的一个环节。经由历程解码,紧缩编码的视频数据输出成为非紧缩的色彩数据,比方YUV420P,RGB等等;紧缩编码的音频数据输出成为非紧缩的音频抽样数据,比方PCM数据。

音视频同步
依据解封装模块处置惩罚历程当中猎取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至体系的显卡和声卡播放出来。

2. 浅易播放器的完成-音视频播放

2.1 试验平台

试验平台:openSUSE Leap 42.3
FFmpeg版本:4.1
SDL版本:2.0.9
FFmpeg开辟情况搭建可参考“ffmpeg开辟情况构建”

2.2 源码流程剖析

参考以下:

2.3 解复用线程

解复用线程就是main()函数地点的主线程。main()函数作一些须要的初始化事情后,建立音频处置惩罚线程和视频处置惩罚线程。
然后main()函数进入主轮回,从输入文件中读取packet,并依据packet范例,将之放入视频packet行列或音频packet行列。

2.4 音频处置惩罚线程

音频处置惩罚线程是SDL库内建线程。用户供应回调函数供音频处置惩罚线程挪用。完成历程参考:
FFmpeg浅易播放器的完成-音频播放

2.5 视频处置惩罚线程

视频处置惩罚线程完成视频解码及播放。完成历程参考:
FFmpeg浅易播放器的完成-音频播放

2.6 源码清单

代码已变得挺长了,不贴完全源码了,源码参考:
https://github.com/leihl/exercises/tree/master/source/ffmpeg/player_avideo/ffplayer.c

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。-

源码清单中触及的一些观点简述以下:
container:
对应数据结构AVFormatContext
封装器,将流数据封装为指定花样的文件,文件花样如AVI、MP4等。
FFmpeg可辨认五种流范例:视频video(v)、音频audio(a)、attachment(t)、数据data(d)、字幕subtitle。

codec:
对应数据结构AVCodec
编解码器。编码器将未紧缩的原始图象或音频数据编码为紧缩数据。解码器与之相反。

codec context:
对应数据结构AVCodecContext
编解码器上下文。此为非常主要的一个数据结构,后文剖析。各API大批运用AVCodecContext来援用编解码器。

codec par:
对应数据结构AVCodecParameters
编解码器参数。新版本增添的字段。新版本发起运用AVStream->codepar替换AVStream->codec。

packet:
对应数据结构AVPacket
经由编码的数据。经由历程av_read_frame()从媒体文件中猎取获得的一个packet能够包罗多个(整数个)音频帧或单个
视频帧,或许其他范例的流数据。

frame:
对应数据结构AVFrame
解码后的原始数据。解码器将packet解码后天生frame。

2.7 编译

gcc -o ffplayer ffplayer.c -lavutil -lavformat -lavcodec -lavutil -lswscale -lSDL2

2.8 测试

选用clock_320.avi测试文件,此文件

ffprobe clock_320.avi

打印视频文件信息以下:

[avi @ 0x9286c0] non-interleaved AVI
Input #0, avi, from 'clock_320.avi':
  Duration: 00:00:12.00, start: 0.000000, bitrate: 42 kb/s
    Stream #0:0: Video: msrle ([1][0][0][0] / 0x0001), pal8, 320x320, 1 fps, 1 tbr, 1 tbn, 1 tbc
    Stream #0:1: Audio: truespeech ([34][0][0][0] / 0x0022), 8000 Hz, mono, s16, 8 kb/s

运转测试敕令:

./ffplayer clock_320.avi 

能够听到每隔1秒播放一次“嘀”声,声响播放12次。时针每隔1秒跳动一格,跳动12次。声响播放一般,画面播放也一般,然则声响和画面不克不及对应,由于没有斟酌音视频同步。下一次试验研讨音视频同步题目。

3. 参考资料

[1] 雷霄骅,视音频编解码手艺零基本学习方法
[2] 雷霄骅,最简朴的基于FFMPEG SDL的视频播放器ver2(接纳SDL2.0)
[3] SDL WIKI, https://wiki.libsdl.org/
[4] Martin Bohme, An ffmpeg and SDL Tutorial, Tutorial 03: Playing Sound

4. 修正纪录

2018-12-06 V1.0 初稿

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。