FFmpeg视频播放

首先记录一下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视频播放)