美文网首页
FFmpeg视频播放

FFmpeg视频播放

作者: EmpathyBasic | 来源:发表于2020-06-14 23:54 被阅读0次

    首先记录一下C++中的NULL、0、nullptr的区别

    NULL在C++中就是0,这是因为在C++中void* 类型是不允许隐式转换成其他类型的,所以之前C++中用0来代表空指针,但是在重载整形的情况下,会出现上述的问题。所以,C++11加入了nullptr,可以保证在任何情况下都代表空指针,而不会出现上述的情况,因此,建议以后还是都用nullptr替代NULL吧,而NULL就当做0使用。

    交叉编译工具介绍

    • CC:编译器,对C源文件进行编译处理,生成汇编文件。
    • AS:将汇编文件生成目标文件(汇编文件使用的是指令助记符,AS将它翻译成机器码)。
    • AR:打包器,用于库操作,可以通过该工具从一个库中删除或者增加目标代码模块。
    • LD:链接器,为前面生成的目标代码分配地址空间,将多个目标文件链接成一个库或者是可执行文件。
    • GDB:调试工具,可以对运行过程中的程序进行代码调试工作。
    • STRIP:以最终生成的可执行文件或者库文件作为输入,然后消除掉其中的源码。
    • NM:查看静态库文件中的符号表。

    使用ar命令解压.a文件

     ar x libavcodec.a
    
    image.png
    **使用nm命令查看函数成员变量
    参考https://blog.csdn.net/stpeace/article/details/47089585
    nm libavcodec.a >aaa.txt
    image.png 解封装.png

    CMake message输出位置

    image.png
    readelf命令

    readelf命令,一般用于查看ELF格式的文件信息,常见的文件如在Linux上的可执行文件,动态库(.so)或者静态库(.a) 等包含ELF格式的文件

    报错
    has text relocations
    增加编译选项

    --disable-asm
    

    编译成功

    #!/bin/bash
    
    API=29
    
    ARCH=x86
    
    PREFIX=./ABC
    
    TOOLCHAIN=/home/guozengjie/Android/android-ndk-r21/toolchains/llvm/prebuilt/linux-x86_64
    
    build()
    {
    ./configure \
    --prefix=$PREFIX \
    --disable-static \
    --enable-shared \
    --enable-small \
    --disable-doc \
    --disable-programs \
    --disable-avdevice \
    --enable-cross-compile \
    --target-os=android \
    --arch=$ARCH \
    --pkg-config=/usr/bin/pkg-config \
    --cc=$TOOLCHAIN/bin/i686-linux-android$API-clang \
    --cross-prefix=$TOOLCHAIN/bin/i686-linux-android- \
    --disable-asm
    
    make clean
    make
    make install
    
    }
    
    build
    

    导入AS

    #设置头文件目录
    include_directories(include)
    #设置库文件目录
    link_directories(../jniLibs/${ANDROID_ABI})
    target_link_libraries( # Specifies the target library.
            native-lib
            avformat avcodec avfilter avutil swresample swscale
            log
            z)
    
    externalNativeBuild {
                cmake {
                    cppFlags ""
                    abiFilters "x86"
                }
            }
    

    函数指针

    int pthread_create(pthread_t* __pthread_ptr, pthread_attr_t const* __attr, void* (*__start_routine)(void*), void*);
    

    void*无类型指针
    C++ 线程

    Android是基于Linux内核的,而Linux是遵循POSIX线程标准的,什么是POSIX线程(百度百科)POSIX线程库中有一系列Pthreads API方便我们对Linux线程的操作。

    pthread_t pid;
    
    void *run(void *) {
        __android_log_print(ANDROID_LOG_ERROR, "TAG", "run");
        pthread_exit(&pid);
    }
     pthread_create(&pid, nullptr, run, nullptr);
    

    Notepad复制一行

    方法主要是应用键盘上的Home键和End键:鼠标光标停留在一行的某处, 按Home键光标会跳到行首,按End键光标会跳到行尾。鼠标光标停留在行首时,按Shift+End就可以选中一行

    __android_log_print 定义宏函数

    #define loge(...) __android_log_print(ANDROID_LOG_ERROR, "FFmpeg", __VA_ARGS__)
    

    -Werror,它要求GCC将所有的警告当成错误进行处理

    adb logcat 乱码
    参考https://www.cnblogs.com/jadyyummy/p/7543704.html
    参考https://www.cnblogs.com/xy-ouyang/p/10688575.html

    方法一:临时修改

    1. chcp 65001
    2. 命令行窗口标题栏右键,选择"属性"->"字体",将字体修改为True Type字体"Lucida Console"

    方法二:永久修改


    image.png
    image.png
    image.png
    image.png

    NDK查看错误日志
    参考https://blog.csdn.net/qq_33505109/article/details/105551017

    adb logcat | ndk-stack -sym F:\AndroidProjects\CPlusPlus\app\build\intermediates\cmake\debug\obj\x86
    

    linux中>表示覆盖原文件内容(文件的日期也会自动更新),>>表示追加内容(会另起一行,文件的日期也会自动更新)。
    顺序执行多条命令:command1;command2;command3;简单的顺序指令可以通过 ;来实现

    C++指针
    参考https://www.cnblogs.com/aquester/p/11469872.html

    F8 单步调试
    F9 运行到下一个断点

    性能优化工具Systrace
    参考https://developer.android.com/topic/performance/tracing/command-line
    参考https://blog.csdn.net/vicwudi/article/details/100191529
    方法一:使用命令行模式
    脚本文件位置F:\Sdk\platform-tools\systrace\systrace.py

    image.png
    如图所示,改脚本只支持python2.7,由于默认版本是3.7,所以我们要切换到python2.7
    conda create -n python2 python=2.7
    conda activate python2
    

    报错ImportError: No module named win32con,解决办法:

    conda search win32
    conda install pywin32
    conda install six
    

    环境已经配置好,然后执行脚本

    python systrace.py  -h
    python systrace.py
    

    方法二:使用开发者选项
    参考https://developer.android.com/topic/performance/tracing/on-device

    image.png

    Systrace文件分析工具https://ui.perfetto.dev/#!/

    C++不可以返回局部变量引用或指针?
    参考https://blog.csdn.net/u010177010/article/details/50802787
    参考https://blog.csdn.net/kai8wei/article/details/44699493

    new 创建类对象,需要指针接受,使用堆空间;而局部不用new对象使用栈空间

    相关文章

      网友评论

          本文标题:FFmpeg视频播放

          本文链接:https://www.haomeiwen.com/subject/fprzyhtx.html