最简iOS播放器(一)

前言

关于音视频的学习已经持续了一年左右,中间因为很多事情总是断断续续的,最近终于可以抽出时间来总结一下,打算连续写几篇博客,包括iOS最简播放器、软解码、硬解码等。
最简iOS播放器使用ffmpeg软解码视频数据,SDL_thread窗口管理,SDL_render渲染视频数据,SDL_audio播放音频数据,SDL_thread管理线程。

正文

一、工具库准备

编译准备ffmpeg和SDL。

  • ffmpeg

ffmpeg的编译可以参考我的博客FFmpeg在iOS开发中编译并使用,这里使用的是ffmpeg-3.4.2。

  • SDL
  1. 下载
    SDL源代码可以到SDL官网下载SDL2.0,如下图
    SDL2下载.png
  2. 编译
    下载好后,解压,在Xcode-iOS目录下打开SDL文件里SDL项目,分别选择模拟器和真机build,生成真机和模拟器的.a库,在products目录下右键libSDL2.a,show in finder显示如下图,Debug-iphoneos和Debug-iphonesimulator下各有一个libSDL2.a.


    build生成.a文件
  3. 合并
    合并模拟器和真机的.a文件,以便在模拟器和真机下都可以使用。
lipo -create 真机build生成的.a文件路径 模拟器build生成的.a文件路径 -output 合并后的路径/合并后的文件名

例如我的:
lipo -create /Users/jusun/Library/Developer/Xcode/DerivedData/SDL-dchfilmmlxomauhaifiahcfggttg/Build/Products/Debug-iphoneos/libSDL2.a /Users/jusun/Library/Developer/Xcode/DerivedData/SDL-dchfilmmlxomauhaifiahcfggttg/Build/Products/Debug-iphonesimulator/libSDL2.a -output /Users/jusun/Desktop/SDL2/libSDL2.a

最后把合并生成的libSDL2.a和头文件放在同一个文件夹下。
SDL2.png

二、环境配置

  1. 把两个编译好的库加入到自己的项目,修改两个库的头文件路径:在build setting里搜索Search Path,找到Header Search Paths,可以看到这里的头文件路径是空的,下一行Library Search Paths是正确的Library路径,双击打开,分别复制粘贴到Header Search Paths这一行,并修改$(PROJECT_DIR)/simple-player/FFmpeg-iOS/lib$(PROJECT_DIR)/simple-player/FFmpeg-iOS/include,同样$(PROJECT_DIR)/simple-player/SDL/lib修改为$(PROJECT_DIR)/simple-player/SDL/include,如下图:
    头文件路径设置.png
  2. 添加必须的三个依赖库
libz.tbd
libbz2.tbd
libiconv.tbd
  1. ViewController.m里导入系统库头文件
#import <VideoToolbox/VideoToolbox.h>
#import <AVFoundation/AVFoundation.h>
#import <GameController/GameController.h>
#import <CoreMotion/CoreMotion.h>

环境配置成功后的目录结构如下图:


目录结构.png

build无报错
,大功告成,环境配置完成。

三、项目构建与改造

  1. 在/Users/jusun/Downloads/FFmpeg-iOS-build-script-master/ffmpeg-3.4.2/fftools目录下
    找到ffplay.c、cmdutils.h、cmdutils.c三个文件拖入项目
  2. 在/Users/jusun/Downloads/FFmpeg-iOS-build-script-master/scratch/arm64目录下找到config.c文件拖入项目
    build项目,cmdutils.h里报错的都注释掉。
  3. ffplay.c搜索找到static const char *input_filename
    修改为
static const char *input_filename = "http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/prog_index.m3u8"
  1. 注释掉main.m里的所有代码,就会默认走ffplay.c里的main方法。
    最终目录结构如下:
最终结构.png

运行项目,如果有弹窗,选择always ignore,就可以正常播放:


正常播放.png

四、总结

基于ffmpeg(软解码)和SDL的最简播放器已经完工,但问题很明显,视频显示不在UIView上,而是显示在了SDLWindow上,如何把视频显示到UIView花了我很大一段时间去研究,也因此学习了openGL,下一篇准备使用shader、openGL渲染到UIView、GLKView上总结一篇博客,还有本篇里涉及到解码流程、渲染流程、线程管理、队列管理知识也很多,抽时间再总结一下写一篇博客。

本篇博客我的代码地址

五、参考学习

  • ijkplayer
  • SGPlayer
  • kxmovie
    音视频学习难度远超原来的想象,软硬解码知识、openGL知识、音频知识、视频知识补充了很多,音视频的学习任重而道远。
    欢迎大家评论、纠错、学习、交流。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载自:[总结]FFMPEG视音频编解码零基础学习方法中国传媒大学雷霄骅博士CSDN博客--致敬雷神 一些资料: ...
    路漫漫其修远兮Wzt阅读 3,093评论 1 42
  • 宝贝,妈妈不是不要你了… 离开你的前一晚 妈妈抱了你一整夜哭了一整夜 妈妈熬不下去了 在那样的一个家庭 妈妈想带你...
    Autisan阅读 287评论 0 0
  • 我最近很焦虑,因为临近毕业了,就业压力比较大。又没有收入来源,未来没有着落,感觉自己像一个漂浮在空中的气球,随时会...
    整理师黄婷阅读 1,128评论 0 2
  • 引子黄河之水天上来,奔流到海不复回,亦诗亦画,可诉不了山村的凄凉。绵绵的洮河水,之于会宁人,那可是三代人的记忆。爷...
    众望城主阅读 407评论 0 1