门户
书籍
教程
论坛
问答
下载
签到
个人空间
帐号
自动登录
找回密码
密码
登录
立即注册
账号
自动登录
找回密码
密码
登录
立即注册
请绘制轨迹完成人机验证
由vaptcha提供技术支持
登录
注册
搜索
搜索
搜索
热搜
qml
quick
串口
输入中文
数据库
arm
百度地图
qt聊天
QT安装
安装
多窗口
中文乱码
聊天
局域网
鼠标
QT
图片
乱码
rs485通讯
多线程
android
多文档编辑器
本版
用户
本版
用户
【HUX】问题互助平台
博客
动态
好友
帖子
收藏
道具
勋章
任务
淘帖
动态
日志
相册
分享
记录
留言板
群组
门户
导读
排行榜
设置
我的收藏
退出
Qt开源社区
›
开放区(网友自由发帖区)
›
项目作品
›
全网唯一/Qt结合ffmpeg实现手机端采集摄像头推流到rtsp ...
发布主题
返回列表
全网唯一/Qt结合ffmpeg实现手机端采集摄像头推流到rtsp或rtmp...
0
回复
79
查看
[复制链接]
liudianwu
当前离线
积分
2827
liudianwu
累计签到:7 天
连续签到:1 天
来源:
2025-7-4 16:22:34
显示全部楼层
|
阅读模式
## 一、前言说明
之前已经实现了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更合理一些。
## 二、效果图
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有帐号?
立即注册
x
回复
使用道具
举报
返回列表
发表新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满)
我知道了