FFmpeg视频播放

2020-06-14  本文已影响0人  EmpathyBasic

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

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

交叉编译工具介绍

使用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对象使用栈空间

上一篇下一篇

猜你喜欢

热点阅读