• ffmpeg草稿


    avformat 用于解析容器和协议(protocol)。 avcodec 用于编码和解码基本流(您已经拥有的)。

    Qt/C++音视频开发44-本地摄像头推流(支持分辨率/帧率等设置/实时性极高)_feiyangqingyun的博客-CSDN博客

    1. void FFmpegThread::initInputFormat()
    2. {
    3. //本地摄像头/桌面录屏
    4. if (videoType == VideoType_Camera) {
    5. #if defined(Q_OS_WIN)
    6. //ifmt = av_find_input_format("vfwcap");
    7. ifmt = av_find_input_format("dshow");
    8. #elif defined(Q_OS_LINUX)
    9. //可以打开cheese程序查看本地摄像头(如果是在虚拟机中需要设置usb选项3.1)
    10. //ifmt = av_find_input_format("v4l2");
    11. ifmt = av_find_input_format("video4linux2");
    12. #elif defined(Q_OS_MAC)
    13. ifmt = av_find_input_format("avfoundation");
    14. #endif
    15. } else if (videoType == VideoType_Desktop) {
    16. #if defined(Q_OS_WIN)
    17. ifmt = av_find_input_format("gdigrab");
    18. #elif defined(Q_OS_LINUX)
    19. ifmt = av_find_input_format("x11grab");
    20. #elif defined(Q_OS_MAC)
    21. ifmt = av_find_input_format("avfoundation");
    22. #endif
    23. }
    24. }
    25. bool FFmpegThread::initInput()
    26. {
    27. //实例化格式处理上下文
    28. formatCtx = avformat_alloc_context();
    29. //设置超时回调(有些不存在的地址或者网络不好的情况下要卡很久)
    30. formatCtx->interrupt_callback.callback = FFmpegHelper::avinterruptCallBackFun;
    31. formatCtx->interrupt_callback.opaque = this;
    32. //打开输入(通过标志位控制回调那边做超时判断)
    33. //其他地方调用 formatCtx->url formatCtx->filename 可以拿到设置的地址(两个变量值一样)
    34. tryOpen = true;
    35. QByteArray urlData = VideoHelper::getRightUrl(videoType, videoUrl).toUtf8();
    36. int result = avformat_open_input(&formatCtx, urlData.data(), ifmt, &options);
    37. tryOpen = false;
    38. if (result < 0) {
    39. debug("打开出错", "错误: " + FFmpegHelper::getError(result));
    40. return false;
    41. }
    42. //根据自己项目需要开启下面部分代码加快视频流打开速度
    43. //开启后由于值太小可能会出现部分视频流获取不到分辨率
    44. if (decodeType == DecodeType_Fastest && videoType == VideoType_Rtsp) {
    45. //接口内部读取的最大数据量(从源文件中读取的最大字节数)
    46. //默认值5000000导致这里卡很久最耗时(可以调小来加快打开速度)
    47. formatCtx->probesize = 50000;
    48. //从文件中读取的最大时长(单位为 AV_TIME_BASE units)
    49. formatCtx->max_analyze_duration = 5 * AV_TIME_BASE;
    50. //内部读取的数据包不放入缓冲区
    51. //formatCtx->flags |= AVFMT_FLAG_NOBUFFER;
    52. //设置解码错误验证过滤花屏
    53. //formatCtx->error_recognition |= AV_EF_EXPLODE;
    54. }
    55. //获取流信息
    56. result = avformat_find_stream_info(formatCtx, NULL);
    57. if (result < 0) {
    58. debug("找流失败", "错误: " + FFmpegHelper::getError(result));
    59. return false;
    60. }
    61. //解码格式
    62. formatName = formatCtx->iformat->name;
    63. //某些格式比如视频流不做音视频同步(响应速度快)
    64. if (formatName == "rtsp" || videoUrl.endsWith(".sdp")) {
    65. useSync = false;
    66. }
    67. //设置了最快速度则不启用音视频同步
    68. if (decodeType == DecodeType_Fastest) {
    69. useSync = false;
    70. }
    71. //有些格式不支持硬解码
    72. if (formatName.contains("rm") || formatName.contains("avi") || formatName.contains("webm")) {
    73. hardware = "none";
    74. }
    75. //本地摄像头设备解码出来的直接就是yuv显示不需要硬解码
    76. if (videoType == VideoType_Camera || videoType == VideoType_Desktop) {
    77. useSync = false;
    78. hardware = "none";
    79. }
    80. //过低版本不支持硬解码
    81. #if (FFMPEG_VERSION_MAJOR < 3)
    82. hardware = "none";
    83. #endif
    84. //获取文件时长(这里获取到的是秒)
    85. double length = (double)formatCtx->duration / AV_TIME_BASE;
    86. duration = length * 1000;
    87. this->checkVideoType();
    88. //有时候网络地址也可能是纯音频
    89. if (videoType == VideoType_FileHttp) {
    90. onlyAudio = VideoHelper::getOnlyAudio(videoUrl, formatName);
    91. }
    92. if (getIsFile()) {
    93. //文件必须要音视频同步
    94. useSync = true;
    95. //发送文件时长信号
    96. emit receiveDuration(duration > 0 ? duration : 0);
    97. }
    98. QString msg = QString("格式: %1 时长: %2 秒 加速: %3").arg(formatName).arg(duration / 1000).arg(hardware);
    99. debug("媒体信息", msg);
    100. return true;
    101. }

    在线电子书

    main入口函数分析—ffplay.c源码分析 · FFmpeg原理

  • 相关阅读:
    又在深夜配环境
    android 默认开启谷歌定位精准度
    【ICer必备基础】MOS电容——电容电压特性详解
    BaiChuan13B-GPTQ量化详解
    【毕业设计】树莓派实现口罩佩戴检测识别 - 单片机 物联网 机器视觉
    Kafka3.0.0版本——文件清理策略
    vlan实验
    操作系统基础知识
    实际开发中常用的Git操作
    23种经典设计模式:单例模式篇(C++)
  • 原文地址:https://blog.csdn.net/LclLsh/article/details/132103711