chenjim 发布的文章

artifactory安装和使用

本文首发地址 https://www.jianshu.com/p/ba57e23ddc1d
最新更新地址 https://gitee.com/chenjim/chenjimblog

artifactory-pro-6.6.0 安装使用

  1. 下载 artifactory-pro-6.6.0.zip 并解压,如需文件,邮件到 me@h89.cn
    下载 artifactory-injector-1.1.jar
  2. 绿化处理,命令java -jar artifactory-injector-1.1.jar,选择2,然后需要输入artifactory解压后的目录,详细如下

    $ java -jar artifactory-injector-1.1.jar
    What do you want to do?
    1 - generate License String
    2 - inject artifactory
    exit - exit
    2
    where is artifactory home? ("back" for back)
    D:\artifactory\artifactory-pro-6.6.0/
    artifactory detected. continue? (yes/no)
    yes
    putting another WEB-INF/lib/artifactory-addons-manager-6.6.0.jar
    META-INF/
    org/
    org/jfrog/
    ...
    
  3. 生成授权License,选择1,记录生成的license,然后exit退出

    What do you want to do?
    1 - generate License String
    2 - inject artifactory
    exit - exit
    1
    eyJhcnRpZmFjdG9yeSI6eyJ......ydGllcyI6e319fQ==
    

    备注

    • 如果没有2、3的处理,不能使用全部功能,跟社区版本差不多,只能添加部分镜像
    • 此处的license在后续配置中会使用到,需要保存一下
  4. 启动 .\artifactory-pro-6.6.0\bin\artifactory.bat start
    Linux:./artifactory-pro-6.6.0/bin/artifactory.sh
    ps -ef | grep artifactory Linux下查看启动的进程信息
    出现 Artifactory successfully started表示启动成功
  5. 建议修改 artifactory-pro-6.6.0\tomcat\conf\server.xml 中 端口 808118081server.xml中的其它端口建议同步修改,避免冲突引起启动异常
  6. 浏览器打开 http://192.168.3.242:18081 进行相应的配置,包含输入步骤3生成的license
    如需修改端口更改 为相应的值即可,如18081,如果本机还有服务使用此文件的其它端口,注意更改。
  7. 菜单 Admin -> Repositories -> Remote -> NEW 选择 maven
    添加如下镜像代理

    Repository KeyURL
    aliyun_publichttps://maven.aliyun.com/repository/public
    aliyun_googlehttps://maven.aliyun.com/repository/google
    jitpackhttps://jitpack.io
  8. 菜单 Admin -> Repositories -> Virtual -> NEW 选择 maven
    Repository Key 填写 android
    RepositoriesSelected Repositories 选择上面添加的 aliyun_publicaliyun_googlejitpack
  9. 此时项目中所有 maven{ *** } 都可以替换为

       maven {
          url 'http://192.168.3.242:18081/artifactory/android'
          //gradle 7.0+  需要打开以下
          //allowInsecureProtocol = true
       }

artifactory 社区版安装使用

  1. 下载地址 https://jfrog.com/open-source/
  2. 安装使用说明
    https://www.jfrog.com/confluence/display/JFROG/Installing+Artifactory
    完整的功能列表请参考:
    https://www.jfrog.com/confluence/display/JCR/Overview
  3. 默认用户名 admin 密码 password

代理 Gradle 本地依赖代理

Gradle项目中下载首次编译,需要从 https://services.gradle.org/distributions 下载 gradle-*.zip
可能会比较慢,我们可以用 artifactory 做代理

方案一

  1. 菜单 Admin -> Repositories -> Remote -> NEW
  2. 弹出对话框 Select Package Type, 选择 Generic
  3. Repository Key 填写 distributionsURL 填写 https://services.gradle.org/distributions
  4. 保存即可

方案二

  1. 菜单 Admin --> Repositories --> Local
  2. 选择 New,选择 maven,输入 Repository Key 内容为 distributions
  3. 菜单 Artifacts 选择上一步添加的 distributions,再点右上角 Deploy
  4. 在弹出界面上传下载的 gradle-*.zip 即可

以上两个方案都可以,网络见到的都是第二种,第一种相对简单,不用每次上传本地的 gradle-*.zip

最后替换 gradle/wrapper/gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip
distributionUrl=http\://192.168.3.242\:18081/artifactory/distributions/gradle-7.0.2-all.zip
即可


安卓上传 aar 到 artifactory

  1. Baselibrary/build.gradle同目录添加文件 artifactoryPublish.gradle,内容如下

    apply plugin: 'maven-publish'
    apply plugin: 'com.jfrog.artifactory'
    
    //定义artifactory仓库的地址,按照你自己的修改
    def MAVEN_LOCAL_PATH = 'http://192.168.3.242:18081/artifactory'
    
    // 定义构件的相关信息
    // 当其他项目远程依赖该构件的时候,结构类似就是 implementation 'GROUP_ID:ARTIFACT_ID:VERSION_NAME'
    def GROUP_ID = 'com.chenjim.android'
    def ARTIFACT_ID = 'andlibs'
    def VERSION_NAME = '0.0.1'
    
    publishing {
     publications {
         aar_pub(MavenPublication) {//注意这里定义的 aar_pub,在artifactoryPublish 下需要使用
             groupId = GROUP_ID
             artifactId = ARTIFACT_ID
             version = VERSION_NAME
    
             // aar文件所在的位置
             // module打包后所在路径为module模块下的build/outputs/aar,生成的aar名称为:module名-release.aar
             artifact("$buildDir/outputs/aar/${project.getName()}-debug.aar")
    
             //当有其他 dependencies api 时可能需要以下
             //参考自 https://chowdera.com/2021/03/20210305112748155c.html
    //            pom.withXml {
    //                def dependencies = asNode().appendNode("dependencies")
    //                configurations.api.allDependencies.each {
    //                    def dependency = dependencies.appendNode("dependency")
    //                    dependency.appendNode("groupId", it.group)
    //                    dependency.appendNode("artifactId", it.name)
    //                    dependency.appendNode("version", it.version)
    //                }
    //            }
         }
     }
    }
    
    artifactoryPublish {
     contextUrl = MAVEN_LOCAL_PATH
     publications('aar_pub')        //注意这里使用的是上面定义的 aar_pub
    
    
    //需要提前创建 Local Repositories,名为 jx_android   
     clientConfig.publisher.repoKey = 'jx_android'        //上传到的仓库地址
     clientConfig.publisher.username = 'jx_jfrog'        //artifactory 登录的用户名
     clientConfig.publisher.password = 'djofYSKEWC2vPh1'    //artifactory 登录的密码
    }
  2. Baselibrary/build.gradle 中添加
    apply from: "./artifactoryPublish.gradle"
  3. 根目录 build.gradledependencies 节点添加
    classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.15.2"

参考自
https://blog.csdn.net/u010976213/article/details/105710511
https://chowdera.com/2021/03/20210305112748155c.html


用artifactory做npm本地镜像

  1. 菜单 Admin --> Repositories --> Remote --> NEW
  2. 选择 npm
  3. Repository Key 填写 npm , URL 填写 https://registry.npm.taobao.org
    经过如上修改,我们就可以使用artifactory做npm的镜像了
  4. 用淘宝镜像配置为 npm config set registry https://registry.npm.taobao.org
    此配置可以替换为 npm config set registry http://192.168.3.242:18081/artifactory/npm

artifactory 上传文件大小配置

  1. 菜单 Admin --> GeneralConfiguration
  2. 更改 File Upload Max Size 内容即可

artifactory无法访问,提示401授权异常

  1. 菜单 Admin --> Security Configuration
  2. 勾选 Allow Anonymous Access ,早期的版本已默认勾选,新版本可能没有

@[toc]

安卓 webrtc 开启 h264 软编解码

本文首发地址 https://blog.csdn.net/CSqingchen/article/details/120199702
最新更新地址 https://gitee.com/chenjim/chenjimblog
本文基于libmediasoupclient 3.2.0 和 webrtc branch-heads/4147(m84)
本文得熟悉相关基础,参考 文1文2
除了需要加编译参数 rtc_use_h264=true, 还需要以下修改以支持h264软编解码
网络搜索到的有很多复制、粘贴,缺少部分内容的,或者版本环境不匹配,很让人头疼。。。。
  1. 修改 ffmpeg_generated.gni 开启 openh264 编解码
    安卓平台默认未支持 h264 解码,会显示黑屏
    third_party/ffmpeg/ffmpeg_generated.gni 中我们可以开到,默认未支持安卓平台
    修改 ffmpeg_generated.gniuse_linux_config,添加 || is_android以支持,结果如下
    use_linux_config = is_linux || is_fuchsia || is_android
    参考自 https://www.codeleading.com/article/3215969775
    而对于软编解码,android webrtc采用openh264 +ffmpeg,这两块的代码都在webrtc源码src/third_party当中
  2. 增加 codec_list parser_list h264 支持
    third_party/ffmpeg/chromium/config/Chrome/android/arm64/libavcodec/parser_list.c 中添加 &ff_h264_parser,
    third_party/ffmpeg/chromium/config/Chrome/android/arm64/libavcodec/codec_list.c 中添加 &ff_h264_decoder,
    third_party/ffmpeg/chromium/config/下有 Chrome ChromeOS Chromium,这里用的是 Chrome,(其它可能有问题。。。)
    需要在编译参数添加 ffmpeg_branding="Chrome"
    这里路径 android/arm64 是需要配合参数 --arch "arm64-v8a",
    如果是 armeabi-v7a 需要同步修改目录 android/arm-neon/libavcodec下内容,
    最终编译参数参考:
    ./tools_webrtc/android/build_aar.py --extra-gn-args 'rtc_use_h264=true ffmpeg_branding="Chrome" rtc_enable_protobuf=false use_rtti=true use_custom_libcxx=false' --arch "arm64-v8a"
  3. 增加文件 LibH264Decoder.java
    复制 sdk/android/api/org/webrtc/LibvpxVp8Decoder.java为同目录 LibH264Decoder.java,修改后如下:

    package org.webrtc;
    public class LibH264Decoder extends WrappedNativeVideoDecoder {
      @Override
      public long createNativeVideoDecoder() {
     return nativeCreateDecoder();
      }
      static native long nativeCreateDecoder();
    }
  4. 增加文件 LibH264Encoder.java
    复制 sdk/android/api/org/webrtc/LibvpxVp8Encoder.java 为同目录 LibH264Encoder.java,修改后如下:

    package org.webrtc;
    public class LibH264Encoder extends WrappedNativeVideoEncoder {
      @Override
      public long createNativeVideoEncoder() {
     return nativeCreateEncoder();
      }
      static native long nativeCreateEncoder();
      @Override
      public boolean isHardwareEncoder() {return false;}
    }
    
  5. 增加 h264_codec.cc
    复制 sdk/android/src/jni/vp8_codec.cc 为同目录 h264_codec.cc,修改后如下:

    #include <jni.h>
    #include "modules/video_coding/codecs/h264/include/h264.h"
    #include "sdk/android/generated_libH264_jni/LibH264Decoder_jni.h"
    #include "sdk/android/generated_libH264_jni/LibH264Encoder_jni.h"
    #include "sdk/android/src/jni/jni_helpers.h"
    namespace webrtc {
    namespace jni {
    static jlong JNI_LibH264Encoder_CreateEncoder(JNIEnv* jni) {
      return jlongFromPointer(H264Encoder::Create().release());
    }
    static jlong JNI_LibH264Decoder_CreateDecoder(JNIEnv* jni) {
      return jlongFromPointer(H264Decoder::Create().release());
    }
    }  // namespace jni
    }  // namespace webrtc
  6. 修改H264 Create()
    添加上面要用到的 H264Encoder::Create(),修改 diff 如下:

    --- a/modules/video_coding/codecs/h264/h264.cc
    +++ b/modules/video_coding/codecs/h264/h264.cc
    @@ -84,6 +84,16 @@ std::vector<SdpVideoFormat> SupportedH264Codecs() {
                         "0")};
     }
    
    +std::unique_ptr<H264Encoder> H264Encoder::Create() {
  7. RTC_LOG(LS_INFO) << "Creating H264EncoderImpl.";
  8. return std::make_unique(cricket::VideoCodec("H264"));
    +#else
  9. RTC_NOTREACHED();
  10. return nullptr;
    +#endif
  11. }
    +
    std::unique_ptr H264Encoder::Create(
    const cricket::VideoCodec& codec) {
    RTC_DCHECK(H264Encoder::IsSupported());

    --- a/modules/video_coding/codecs/h264/include/h264.h
    +++ b/modules/video_coding/codecs/h264/include/h264.h
    @@ -43,6 +43,7 @@ std::vector SupportedH264Codecs();

    class RTC_EXPORT H264Encoder : public VideoEncoder {
    public:

  12. static std::unique_ptr Create();
    static std::unique_ptr Create(const cricket::VideoCodec& codec);
    // If H.264 is supported (any implementation).
    static bool IsSupported();

  13. 修改 sdk/android/BUILD.gn
    将其中 vp8 相关地方复制添加 h264 相关,我的一份修改 diff 如下,若编译有问题或者无效,需仔细核对此处。。。

    @@ -45,6 +45,7 @@ if (is_android) {
        ":java_audio_device_module_java",
        ":libjingle_peerconnection_java",
  14. ":libH264_java",

    ":libvpx_vp8_java",
    ":libvpx_vp9_java",
    ":logging_java",

    @@ -489,6 +490,20 @@ if (is_android) {
    ]
    }

  15. rtc_android_library("libH264_java") {
  16. visibility = [ "*" ]
  17. sources = [
  18. "api/org/webrtc/LibH264Decoder.java",
  19. "api/org/webrtc/LibH264Encoder.java",
  20. ]
  21. deps = [
  22. ":base_java",
  23. ":video_api_java",
  24. ":video_java",
  25. "//rtc_base:base_java",
  26. ]
  27. }
    +
    rtc_android_library("libvpx_vp9_java") {
    visibility = [ "*" ]
    sources = [
    @@ -512,6 +527,7 @@ if (is_android) {

    deps = [

    ":base_java",
  28. ":libH264_java",

    ":libvpx_vp8_java",
    ":libvpx_vp9_java",
    ":video_api_java",

    @@ -783,6 +799,18 @@ if (current_os == "linux" || is_android) {
    ]
    }

  29. rtc_library("libH264_jni") {
  30. visibility = [ "*" ]
  31. allow_poison = [ "software_video_codecs" ]
  32. sources = [ "src/jni/h264_codec.cc" ]
  33. deps = [
  34. ":base_jni",
  35. ":generated_libH264_jni",
  36. ":video_jni",
  37. "../../modules/video_coding:webrtc_h264",
  38. ]
  39. }
    +
    rtc_library("libvpx_vp9_jni") {
    visibility = [ "*" ]
    allow_poison = [ "software_video_codecs" ]
    @@ -799,6 +827,7 @@ if (current_os == "linux" || is_android) {
    visibility = [ "*" ]
    allow_poison = [ "software_video_codecs" ]
    deps = [
  40. ":libH264_jni",

    ":libvpx_vp8_jni",
    ":libvpx_vp9_jni",

    ]
    @@ -1203,6 +1232,16 @@ if (current_os == "linux" || is_android) {
    jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
    }

  41. generate_jni("generated_libH264_jni") {
  42. sources = [
  43. "api/org/webrtc/LibH264Decoder.java",
  44. "api/org/webrtc/LibH264Encoder.java",
  45. ]
    +
  46. namespace = "webrtc::jni"
  47. jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
  48. }
    +
    generate_jni("generated_libvpx_vp9_jni") {
    sources = [

    "api/org/webrtc/LibvpxVp9Decoder.java",
  49. 修改 SoftwareVideoDecoderFacoty.java 和 SoftwareVideoEncoderFacoty.java
    需要 分别注册 H.264 并添加创建 codec 的代码, 我的修改 DIFF 如下

    --- a/sdk/android/api/org/webrtc/SoftwareVideoDecoderFactory.java
    +++ b/sdk/android/api/org/webrtc/SoftwareVideoDecoderFactory.java
    @@ -26,6 +26,10 @@ public class SoftwareVideoDecoderFactory implements VideoDecoderFactory {
    @Nullable
    @Override
  50. if (codecType.getName().equalsIgnoreCase("H264")) {
  51. return new LibH264Decoder();
  52. }
    +
    if (codecType.getName().equalsIgnoreCase("VP8")) {

    return new LibvpxVp8Decoder();

    }
    @@ -45,6 +49,9 @@ public class SoftwareVideoDecoderFactory implements VideoDecoderFactory {
    List codecs = new ArrayList();

    codecs.add(new VideoCodecInfo("VP8", new HashMap<>()));
    +

  53. codecs.add(new VideoCodecInfo("H264", new HashMap<>()));
    +
    if (LibvpxVp9Decoder.nativeIsSupported()) {

    codecs.add(new VideoCodecInfo("VP9", new HashMap<>()));

    }

    --- a/sdk/android/api/org/webrtc/SoftwareVideoEncoderFactory.java
    +++ b/sdk/android/api/org/webrtc/SoftwareVideoEncoderFactory.java
    @@ -19,6 +19,9 @@ public class SoftwareVideoEncoderFactory implements VideoEncoderFactory {
    @Nullable
    @Override
    public VideoEncoder createEncoder(VideoCodecInfo info) {

  54. if (info.name.equalsIgnoreCase("H264")) {
  55. return new LibH264Encoder();
  56. }
    if (info.name.equalsIgnoreCase("VP8")) {

    return new LibvpxVp8Encoder();

    }
    @@ -38,6 +41,9 @@ public class SoftwareVideoEncoderFactory implements VideoEncoderFactory {
    List codecs = new ArrayList();

    codecs.add(new VideoCodecInfo("VP8", new HashMap<>()));
    +

  57. codecs.add(new VideoCodecInfo("H264", new HashMap<>()));
    +
    if (LibvpxVp9Encoder.nativeIsSupported()) {

    codecs.add(new VideoCodecInfo("VP9", new HashMap<>()));

    }

  58. 编译使用吧,祝好运。。。

本文参考自 webrtc M75支持android安卓H264软编解遇到的一些坑
在其基础补充、完善部分说明和详细修改结果,如有问题欢迎反馈


其它相关文档

Git配置和常用命令

Git下载地址 https://git-scm.com/downloads
本文地址 https://blog.csdn.net/CSqingchen/article/details/105674924
最新 文章连接,本文不再同步

初始配置

  1. 账号邮箱配置

    git config --global user.name chenjim
    git config --global user.email me@h89.cn

  2. alias简写配置

    git config --global alias.cp cherry-pick
    git config --global alias.co checkout
    git config --global alias.ci commit
    git config --global alias.br branch
    git config --global alias.st status

    在~/.bashrc添加gl支持
    alias gl="git log --oneline --all --graph --decorate"

  3. warning: LF will be replaced by CRLF
    mac/linux:
    git config --global core.autocrlf input
    windows:
    git config --global core.autocrlf true(默认情况) 详细配置说明 https://www.jianshu.com/p/0a747b2b76a2
  4. windows中文名称、路径变成xx%解决
    git config core.quotepath false
  5. git代理配置
  • 全局git代理配置
    git config --global http.proxy socks5://127.0.0.1:1080
  • 只github.com 使用代理
    git config --global http.https://github.com.proxy socks5://127.0.0.1:1080
  • 移除代理配置
    git config --global --unset http.proxy
    git config --global --unset http.https://github.com.proxy
  1. 生成ssh的key命令
    ssh-keygen 直接回车
  2. 查看当前用户的配置
    vi ~/.gitconfig 或者git config -l
  3. 长期存储密码
    git config --global credential.helper store
    或者将账号密码存储在http url
    git remote rm origin
    git remote add origin http://yourname:password@git.oschina.net/name/project.git
  4. 设置文本编辑器
    git config --global core.editor vi
  5. 配置是否忽略文件权限
    git config --global core.filemode false
    windows下:false不忽略可执行权限;true忽略。Linux下相反。
    windows下对文件gradlew增加可执行权限
    git add --chmod=+x gradlew 增加+x;移除-x
    或者git update-index --chmod=+x gradlew
  6. windows 不忽略文件大小写,默认忽略大小写。
    git config --global core.ignorecase false
    git config core.ignorecase false

创建commit模板

  1. 建立~/.git/template文件,内容如下
    OverView: (简单的修改描述)
    Bug ID: (项目名称,bug号:例如name12345,添加新功能bug为0)
    Description: (bug标题,修改的详细描述)
  1. 设置模板
    git config --global commit.template ~/.git/template
  2. gerrit commit 提交
    git commit -s 会自动打开模板,填好save就行了,git会自动提交

    • gerrit 提交到master
      git push origin HEAD:refs/for/master
    • gerrit 审核不通过,再次commit
      git commit -s --amend
    • 对于git项目为了在提交时自动产生change-id,
      scp -P 29418 -p username@10.1.11.10:/hooks/commit-msg .git/hooks
      scp -P 29418 -p chenjim@review.putao.io:hooks/commit-msg .git/hooks/

ssh的配置文件的使用

  • 创建配置文件

    $ cd ~/.ssh
    $ touch config
    $ vi config
  • 输入以下文件内容

    Host ha
    HostName review.putao.io
    User chenjim
    Port 29418
    IdentityFile ~/.ssh/id_rsa
  • 完成后,下面写法结果等效
    git clone ssh://chenjim@review.putao.io:29418/PTlauncher
    git clone ssh://ha/PTlauncher
  • 使用
    repo init -u ssh://ha/t700_v5.1/manifest
    repo sync

创建新git仓库并push到远程:

  mkdir GitCamera
  cd GitCamera
  git init
  touch README.md
  git add README.md
  git commit -m "first commit"
  git remote add origin  https://git.oschina.net/chenjim/GitCamera.git
  git push -u origin master

push已有项目到远程仓库

cd existing_git_repo
git remote add origin  https://git.oschina.net/chenjim/GitCamera.git
git push -u origin master

查看、添加、提交、删除、找回,重置修改文件

git help 显示command的help
git show 显示最后一次提交的内容
git show de0d8f066ace 显示commit id 为 de0d8f066ace 的提交修改的内容
git co . 抛弃工作区修改
git add . 将所有修改过的工作文件提交暂存区
git rm abc/abc.java 从版本库中删除文件
git reset abc/abc.java 从暂存区恢复到工作文件
git reset . 从暂存区恢复到工作文件
git reset --hard 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改
git reset HEAD~1 --hard 销毁最后一次本地提交
git ci -am "some comments" 将git add, git rm和git ci等操作都合并在一起
git ci --amend 修改最后一次提交记录
git revert <$id> 还原某次提交,会创建一个新的commit
git revert HEAD 恢复最后一次提交,会创建一个新的commit


git stash 的使用

git stash 缓存当前所有修改
git stash list 列出当前所有的缓存
git stash pop 应用最近一次的缓存,并删除当前缓存
git stash show -p stash@{0} 显示第0个缓存的详细修改,无-p,只显示修改的文件列表
git stash clear 清除所有的缓存


查看文件diff

git diff 比较当前文件和暂存区文件差异
git diff <id1> <id2> 比较两次提交之间的差异
git diff dev main 在两个分支之间比较
git diff --staged 比较暂存区和版本库差异
git diff --stat HEAD~1 仅比较跟上一次修改的统计信息


查看提交记录

git log . 查看当前目录所有的提交记录
git log --stat 查看提交统计信息
git log --stat --since=3.weeks 查看最近三周提交统计信息
git log --stat --since="2018-06-02" 查看日期"2018-06-02"之后的提交统计信息
git log --pretty=oneline -4 显示最近4次修改记录,包含修改内容
git log -p da28c5581 显示某次详细修改内容
git log -p -4 显示最近4次修改记录,包含修改内容
git log -4 显示最近4次修改记录,只主要信息,不包含修改内容
git log -4 --name-status 显示最后4次修改牵扯到的文件
git log --author="jim.chen" 显示某个作者的log
git show da28c5581 显示某某次修改的内容


Git 本地分支管理--查看、切换、创建和删除分支

注意br 为 branch 的 alias 简写
git br --all 查看所有本地和远程分支名称
git br -r 查看远程分支
git br dev 基于当前HEAD创建新的分支dev
git br -v 查看各个分支最后提交信息
git br --merged 查看已经被合并到当前分支的分支
git br --no-merged 查看尚未被合并到当前分支的分支
git co dev 切换到已经存在的dev分支
git co -b dev 基于当前HEAD,创建新的分支dev,并且切换到新的分支
git co $id 切换代码到某次提交记录,无分支信息,切换到其他分支会自动删除
git co -b dev origin/master 把远程的master迁出到本地分支dev
git co -b debug 0788dee 基于提交0788dee切换到新的debug分支
git br -d dev 删除dev本地分支
git br -D dev 强制删除dev分支 (未被合并的分支被删除的时候需要强制)

分支 master 设置为跟踪来自 origin 的远程分支 master。
git branch --set-upstream-to=origin/master master
或者
git branch --set-upstream master origin/master
git checkout -b master remotes/origin/master

当前HEAD所在分支的名称
git rev-parse --abbrev-ref HEAD


分支合并和rebase

git merge dev 将dev分支合并到当前分支
git merge origin/main --no-ff 不要Fast-Foward合并远程main分支,这样可以生成merge提交
git rebase master 将当前分支 rebase 到master节点之后
Git补丁管理(方便在多台机器上开发同步时用)
git diff > ../sync.patch 生成补丁
git apply ../sync.patch 使用补丁
git apply --check ../sync.patch 测试补丁能否成功
patch -p1 < ../sync.patch 使用patch命令打补丁


Git暂存管理

git stash 暂存
git stash pop 恢复暂存的内容
git stash list 列所有stash
git stash apply 恢复暂存的内容
git stash drop 删除暂存区
git stash clear 清除所有暂存


Git远程分支管理

git pull 抓取远程仓库所有分支更新并合并到本地
git pull --no-ff 抓取远程仓库所有分支更新并合并到本地,不要快进合并
git pull --rebase 抓取远程分支到本地,将本地修改rebase远程最新后
git fetch origin 抓取远程仓库更新
git merge origin/master 将远程主分支合并到本地当前分支
git push push 所有分支
git push origin dev 将本地dev分支推到远程dev分支
git push -u origin main 将本地main分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
git push origin :dev 删除远程分支dev
git push github HEAD:dev --force 将当前HEAD强制推送到dev分支,github 参见下一节 'Git远程仓库管理'


Git远程仓库管理

git remote -v 查看远程服务器地址和仓库名称
git remote show origin 查看远程服务器仓库状态
git remote add origin git@gitee.com:chenjim/thirdPartyJniSo.git 添加远程仓库地址
git remote add github git@github.com:chenjim/thirdPartyJniSo.git 添加远程仓库地址
git remote set-url origin git@gitee.com:chenjim/thirdPartyJniSo.git 设置远程仓库地址(用于修改远程仓库地址)
git remote rm 删除远程仓库地址
git remote prune origin 删除已删除的分支(同步本地远程分支)


创建远程仓库

git clone --bare thirdPartyJniSo git@gitee.com:chenjim/thirdPartyJniSo.git 用带版本的项目创建纯版本仓库
scp -r thirdPartyJniSo git@git.csdn.net:~ 将纯仓库上传到服务器上
mkdir robbin_site.git && cd robbin_site.git && git --bare init 在服务器创建纯仓库
git remote add origin git@gitee.com:chenjim/thirdPartyJniSo.git 设置远程仓库地址
git push -u origin master 客户端首次提交
git push -u origin develop 首次将本地develop分支提交到远程develop分支,并且track
git remote set-head origin master 设置远程仓库的HEAD指向master分支


tag 使用

创建带有说明的标签,用-a指定标签名,-m指定说明文字:
git tag -a VV1.0 -m "version 1.0 released push url" d5a65e9
git show V1.0 查看标签V1.0信息
git tag V1.0 给当前commit添加tag V1.0
git tag V1.0 471fd27 给指定commit 471fd27 添加tag
git push origin V1.0 将指定tag推送到远程
git push --tags 将所有tag推送到远程
git push origin --tags 将所有tag推送到远程
git tag -d V1.0 删除本地tag
git push origin :V1.0 删除远程tag
git push origin --delete tag V1.0 删除远程tag
git ls-remote --tags origin 查询远程tags

Git 如何同步本地tag与远程tag

  • 问题场景:
    同事A在本地创建tagA并push同步到了远程
    ->同事B在本地拉取了远程tagA(git fetch)
    ->同事A工作需要将远程标签tagA删除
    ->同事B用git fetch同步远端信息,git tag后发现本地仍然记录有tagA
  • 分析:
    对于远程repository中已经删除了的tag,
    即使使用git fetch --prune,甚至"git fetch --tags"确保下载所有tags,也不会让其在本地也将其删除的。
    而且,似乎git目前也没有提供一个直接的命令和参数选项可以删除本地的在远程已经不存在的tag
  • 解决方法:
    git tag -l | xargs git tag -d #删除所有本地tag分支
    git fetch origin --prune #从远程拉取所有信息

reflog 使用

reflog是Git操作的一道安全保障,它能够记录几乎所有本地仓库的改变。
包括所有分支commit提交,已经删除(其实并未被实际删除)commit都会被记录。
总结:只要HEAD发生变化,就可以通过reflog查看到。

git reflog 查看最近的git变化
git checkout HEAD@{90} 将指定的变化迁出


**原创文章,转载请注明出处、原文链接!
邮件 mailto:me@h89.cn ,主页 https://chenjim.com**


相关链接

@[toc]

安卓mediasoup输出H264流(支持H264编码)

本文首发地址 https://blog.csdn.net/CSqingchen/article/details/120218832
最新更新地址 https://gitee.com/chenjim/chenjimblog
首先得让mediasoup支持H264编解码,参见 前文

默认视频编码是VP8源码分析

相关源码流程、注释如下

//文件 RoomClient.java 中 
@WorkerThread
private void joinImpl() {
    mMediasoupDevice = new Device();
    //从服务端获取编解码能力
    String routerRtpCapabilities = mProtoo.syncRequest("getRouterRtpCapabilities");
    //最终会调用到 libmediasoupclient/src/Device.cpp 中  Device::Load 
    mMediasoupDevice.load(routerRtpCapabilities);
}

//文件 libmediasoupclient/src/Device.cpp 中 
void Device::Load(json routerRtpCapabilities, const PeerConnection::Options* peerConnectionOptions){
  ...
  //将设备编码能力和服务端编码能力匹配
  this->extendedRtpCapabilities = ortc::getExtendedRtpCapabilities(nativeRtpCapabilities, routerRtpCapabilities);
  ...
}

//最终视频编码方案代码在  文件 libmediasoupclient/src/Transport.cpp 中 
SendTransport::SendTransport(...){
    ...
    auto sendingRtpParametersByKindV= ortc::getSendingRtpParameters("video", *extendedRtpCapabilities);
}

//查看 libmediasoupclient/src/ortc.cpp 中 getSendingRtpParameters 我们可以看到如下
json getSendingRtpParameters(const std::string& kind, const json& extendedRtpCapabilities){
  ...
  for (const auto& extendedCodec : extendedRtpCapabilities["codecs"]){
    ...
    //找到一个编码器,就 break,跳出了
    // NOTE: We assume a single media codec plus an optional RTX codec.
        break;
  }
  ...
}

修改支持H264编码

通过上节分析,我们需要使 routerRtpCapabilities"mimeType": "video/H264", 字段靠前
可以在 RoomClient.java 中修改,也可以在 Device.cppDevice::Load 修改
以下是用后者的修改方案,只保留H264,参考自 mediasoup支持h264

--- a/src/Device.cpp
+++ b/src/Device.cpp
@@ -55,9 +55,25 @@ namespace mediasoupclient
      if (this->loaded)
              MSC_THROW_INVALID_STATE_ERROR("already loaded");

+     auto &remoteCaps = routerRtpCapabilities["codecs"];
+     std::string mimeTypeH264 = "video/H264";
+     std::transform(mimeTypeH264.begin(), mimeTypeH264.end(), mimeTypeH264.begin(), ::tolower);
+     for (nlohmann::json::iterator itr=remoteCaps.begin(); itr!= remoteCaps.end();) {
+         nlohmann::json tmp = *itr;
+         std::string tmpCodec = tmp["mimeType"];
+         std::transform(tmpCodec.begin(), tmpCodec.end(), tmpCodec.begin(), ::tolower);
+         if (tmpCodec != mimeTypeH264 && tmp["kind"] == "video") {
+             itr = remoteCaps.erase(itr);
+         } else {
+             itr++;
+         }
+     }
+
      // This may throw.
      ortc::validateRtpCapabilities(routerRtpCapabilities);

到这里,SDP已经支持H264编码,最终还得依赖设备的H264编码能力,参考 前文

我们可以在 https://v3demo.mediasoup.org 看到设备推出流的编码信息,如下图


其它相关文档