首页| 论坛| 消息
主题:全网唯一/Qt结合ffmpeg实现手机端采集摄像头推流到rtsp或rtmp/可切换前置后置摄像头/指定分辨率帧率
liudianwu发表于 2025-07-04 16:12
## 一、前言说明
之前已经实现了Qt结合ffmpeg在安卓上运行,所有在win上的功能,在安卓上都已经实现,比如编码保存到MP4文件,正常解码音视频文件播放等,唯独还差一个功能,尽管用的不多,但是还是有一定需求的,那就是采集手机上的摄像头。以前傻哔哔的以为和linux类似,去打开/dev/video0设备文件的方式去读取,发现根本没用,后面又怀疑过权限的问题,于是想尽了各种办法把需要的权限全部加上了,还是没用。后面通过阅读ffmpeg的源码,发现有个libavdevice/android_camera.c文件,看名字就知道,这就是采集安卓摄像头的,意味着底层肯定是支持了,这下子信心大增,终于查到问题所在,原来是之前用的那个ffmpeg安卓库,并没有把avdevice模块编译进去,于是找到音视频大佬王斌(QtAV/MDK的作者),让他帮忙给编译一个,替换后,果真可以了,前后拖了好几年的疑难杂症终于解决了。去楼下沙县吃大餐必须加两个蛋。
在查阅代码过程中,发现ffmpeg模块化设计的真的非常棒,尽管是C语言设计的框架,没有C++的封装集成多态特性,但是也实现了具体的不同的操作系统平台对应不同的实现,尤其是avdevice模块采集摄像头这块,在win上对应dshow.c,在linux上对应v4l2.c,在安卓上对应android_camera.c,做的非常好,然后在对应的具体代码实现中可以找到对应的可以设置的键值,一般在代码文件底部有个static const AVOption options[]存储的,比如win和linux可以设置pixel_format,安卓是通过设置camera_index来实现前置后置摄像头的选择,安卓还可以设置input_queue_size来定义缓存帧队列的大小。其实安卓上未必只有两个摄像头,有些开发板可能有四个设置更多,只要底层驱动支持就行,要打开哪个就设置camera_index即可。
能够打开采集摄像头后,其他的流程和之前的完全一样,一行代码都不用改,唯一就是增加了几行代码,用来设置camera_index,通过从url中取出来,比如video=0就是camera_index=0,编码保存到MP4文件和编码推流,都是全部通用的,唯一区别就是多了个旋转角度,毕竟在手机上摄像头是有旋转角度的,一个是90度,一个是270度,采集后画面必须按照这个角度旋转才行,包括推流也是。
是不是所有安卓版本都支持,根据源码文档说明,要从api level 21也就是安卓5.0开始才支持,这个相信目前的设备肯定都能做到,几乎没有5以下的设备了,对ffmpeg版本有要求吗?也有的,从ffmpeg4开始才有android_camera.c,尽管现在ffmpeg飙版本很厉害,目前看下来主流还是ffmpeg4版本用的多,从ffmpeg5.0开始到现在最新的ffmpeg8.0,内容没有更新很多,版本号确加了很大,其实确切的说应该是ffmpeg4.6 4.7 4.8更合理一些。
## 二、效果图

浏览大图

浏览大图
回帖(0):

全部回帖(0)»
最新回帖
收藏本帖
发新帖