jjzjj

qnx环境下编译ffmpeg及解码mp4实践

I am 006! 2024-05-01 原文

一 ffmpeg简介

1.ffmpeg是一套可以用来进行音视频处理的工具和编解码库;

2.采用LGPL或GPL许可证(不能修改源码,只能使用so库,如果要修改源码,必须发布工程代码);

3.ffmpeg对与硬件平台、GPU做了很多优化,效率非常高;

4.包含库:

(1)avcodec 编解码(最重要的库)

(2)avformat 封装格式处理

(3)avfilter 滤镜特效处理

(4)avdevice 各种设备的输入输出

(5)avutil 工具库

(6)postproc 后加工

(7)swresample 音频采样数据格式转换

(8)swscale 视频像素数据格式转换

二 在qnx710环境编译ffmpeg源码

1.源码:

GitHub - FFmpeg/FFmpeg: Mirror of https://git.ffmpeg.org/ffmpeg.git

2.解压

tar jxvf ffmpeg-snapshot.tar.bz2

3.下载yasm(yasm是汇编编译器,ffmpeg为了提高效率使用了汇编指令,如MMX和SSE等,所以系统中未安装yasm时,就会报“nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.”)

wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
#解压
tar zxvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make
cp -f yasm ytasm vsyasm /home/zt/ffmpeg/ #将编译出来的yasm拷贝到ffmpeg目录
export PATH=../:$PATH   #修改系统路径
4.编译ffmpeg
#! /bin/bash

g_root_path="$( cd "$( dirname "$0" )" && pwd )" #当前路径

function update_build_folder(){
    local build_dir=$1
    if [[ -z $1 ]]
    then
        build_dir="build"
    fi

    if [[ ! -d $build_dir ]]
    then
        mkdir ${build_dir}
        echo ${build_dir}
        return 0
    else
        build_dir=$build_dir"1"
        update_build_folder ${build_dir}
        return 0
    fi
}

function compile_ffmpeg(){
    local build_dir_name=$1
    local ffmpeg_source_dir_path=$2
    local qnx_sdp_source_dir_path=$3
    
    if [[ -z build_dir_name ]] || [[ -z ffmpeg_source_dir_path ]] || [[ -z qnx_sdp_source_dir_path ]] 
    then
        echo error should input 3 param
    fi

    path_build_dir=$(update_build_folder "$g_root_path/"${build_dir_name})
    local pkgconfig_dir_path=$(update_build_folder ${path_build_dir}/pkg)

    echo current establish build dir:$path_build_dir
    echo current establish pkg dir:$pkgconfig_dir_path

    source ${qnx_sdp_source_dir_path}/qnx710/qnxsdp-env.sh

    cd ${ffmpeg_source_dir_path}
    ./configure \
    --cc=${qnx_sdp_source_dir_path}/qnx710/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-gcc-8.3.0 \
    --prefix=${path_build_dir} \
    --pkgconfigdir=${pkgconfig_dir_path} \
    --enable-pic \
    --enable-cross-compile \
    --disable-optimizations \
    --disable-stripping \
    --target-os=qnx \
    --arch=aarch64 \
    --enable-shared \
    --disable-static \
    --enable-gpl \
    --enable-nonfree \
    --enable-asm \
    --disable-avdevice \
    --disable-swresample \
    --disable-postproc \
    --disable-avfilter \
    --disable-programs \
    --disable-logging \
    --disable-everything \
    --enable-avformat \
    --enable-decoder=hevc \
    --enable-decoder=h264 \
    --enable-decoder=mpeg4 \
    --enable-decoder=aac \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-doc \
    --disable-devices \
    --disable-network \
    --disable-hwaccels \
    --disable-parsers \
    --disable-bsfs \
    --disable-debug \
    --enable-protocol=file \
    --enable-demuxer=mov \
    --enable-demuxer=flv \
    --disable-indevs \
    --extra-cflags="-std=gnu99 -fPIC" \
    --disable-outdevs


    make && make install
}

compile_ffmpeg \
 ffmpeg_build  \
 /home/xx/ffmpeg/ffmpeg \
 /home/xx/qnx710


注意修改如下:
compile_ffmpeg \
 ffmpeg_build  \    #编译后相关库输出路径
 /home/xx/ffmpeg/ffmpeg \   #ffmpeg源码路径
 /home/xx/qnx710            #qnx710环境路径

使用时,需要拷贝inclue和lib到自己的代码工程目录,添加相关库链接即可。

三 ffmpeg解码mp4流程

1.打开视频

avformat_open_input(&format_ctx_, video_path, nullptr, nullptr);

2.寻找视频流

avformat_find_stream_info(format_ctx_, nullptr);

3.定位视频索引通道

for (uint i = 0;i < format_ctx_->nb_streams;i++) {

    LOG_I("codec_type:%d", format_ctx_->streams[i]->codecpar->codec_type);

    if (AVMEDIA_TYPE_VIDEO == format_ctx_->streams[i]->codecpar->codec_type) {

        video_stream_index_ = i;

        break;

    }

}

4.寻找解码器

codec_ = (AVCodec*)avcodec_find_decoder(format_ctx_->streams[video_stream_index_]->codecpar->codec_id);

5.创建解码上下文

codec_ctx_ = avcodec_alloc_context3(codec_);

6.为解码上下文分配参数

ret = avcodec_parameters_to_context(codec_ctx_, format_ctx_->streams[video_stream_index_]->codecpar);

7.配置解码线程数

codec_ctx_->thread_count = thread_num_;

8.打开解码器

ret = avcodec_open2(codec_ctx_, codec_, nullptr);

四 ffmpeg解码mp4实例

1.功能:对指定mp4(1280✖800)文件进行解码,输出为(1280✖800)uyvy格式文件

2.代码

https://github.com/wangzhicheng2013/ffmpeg_decode_video

注意:替换I420转uyvy函数即可

有关qnx环境下编译ffmpeg及解码mp4实践的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  3. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  4. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  5. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  6. ruby-on-rails - ruby gem如何在rails环境下工作 - 2

    我试图在rails中了解rubygems是如何变得可以自动使用的,而不是在使用required的文件中gem? 最佳答案 这是通过bundler/setup完成的:http://bundler.io/v1.3/bundler_setup.html.它在您的config/boot.rb文件中是必需的。简而言之,它首先将环境变量设置为指向您的Gemfile:ENV['BUNDLE_GEMFILE']||=File.expand_path('../../Gemfile',__FILE__)然后它通过要求bundler/setup将所有ge

  7. ruby - 无法在 Ruby 中将 ffmpeg 作为子进程运行 - 2

    我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope

  8. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  9. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

  10. ruby-on-rails - 我需要一个真正的 UNIX RoR 开发环境 - 2

    从一开始,我就是一个Windows高手。我从MS-DOS开始。我安装了Windows2.1以及此后的所有Windows。现在,我家里有10台不同的Windows机器在运行,从Windows7Ultimate到各种版本的WindowsServer。我还没有完成Windows8,也不想去那里。我在服务器和各种软件方面都有UNIX经验,但它并不是我的首选环境。但是,我想我正在转换。我试图假装使用Cygwin和MSYS在Windows下运行UNIX。我的目的是搭建一个开发环境。两者都让我失望了。我花了比开发更多的时间来解决一系列技术问题。这是NotAcceptable。到目前为止,我的Ruby

随机推荐