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

Posted I am 006!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qnx环境下编译ffmpeg及解码mp4实践相关的知识,希望对你有一定的参考价值。

一 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函数即可

Window下编译 64位ffmpeg 引入libx264 libmp3lame库

      好记性不如烂笔头,每次编译总要有些时间折腾,记录下编译过程,方便后来者。

     本文 介绍windows下编译64位Ffmpeg库 (版本V4.02)如何引入libx264及libmp3lame(编码mp3)库。

编译环境选择MinGW64。MinGW64如何安装可参考前面的文章https://www.cnblogs.com/wanggang123/p/9896564.html 

一.. 编译x264库,如需要ffmpeg支持h264编码编译时需要将它添加进来。编译x264库相对容易,一次搞定。

      首先下载x264库,用最新的版本就可以,下载的地址是https://www.videolan.org/developers/x264.html

      接着configure,configure参数如下图所示。

技术图片

     图1. x264库 configure示意图

      x264库配置 需要nasm ,可以下载可执行文件放到MinGW64安装路径下的bin目录,如图2所示。http://www.linuxfromscratch.org/blfs/view/8.2/general/nasm.html

 

技术图片

 

                                                                                    图2  nasm.exe 安装路径

未完成,明天继续写。

 

 

  

 

以上是关于qnx环境下编译ffmpeg及解码mp4实践的主要内容,如果未能解决你的问题,请参考以下文章

Mac 平台 Android FFmpeg 编译与集成实践

Mac 平台 Android FFmpeg 编译与集成实践

Mac 平台 Android FFmpeg 编译与集成实践

Windows系统下编译FFmpeg for Android(支持x264)

windows下编译ffmpeg源码及常见问题

Window下编译 64位ffmpeg 引入libx264 libmp3lame库