Android随手录#FFmpeg-->交叉编译,常见命令使用

Android随手录#FFmpeg-->交叉编译,常见命令使用

Download

  1. Windows : ffmpeg tools exe下载
  2. Ubuntu : 源码下载(git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg)

FFmpeg常见命令使用

//把输入视频转化成h265编码并封装成mp4
ffmpeg -i INPUT.mp4 -c:v libx265 -an -x265-params crf=25 OUT.mp4
 
//把输入视频转化成h265编码并封装成mkv
ffmpeg -i INPUT,mp4 -c:v libx265 -an -x265-params crf=25 OUT.mkv 

//提取这个视频的h264码流
ffmpeg -i INPUT.mp4  -vcodec copy -f h264 OUT.h264 

//提取这个mp4视频的h264码流
ffmpeg -i INPUT.mp4 -codec copy -bsf h264_mp4toannexb -f h264 OUT.h264 

//提取出这个视频的h265码流
ffmpeg -i INPUT.mkv  -vcodec copy -f hevc OUT.h265 

//把这个h264码流封装成mp4视频格式
ffmpeg -i INPUT.264 -vcodec copy -f mp4  OUT.mp4 

//输出这个视频的编码等信息到OUTPUT.txt
ffprobe INPUT.mp4 -show_streams -select_streams v -print_format json > OUTPUT.txt  

 //输出这个视频/音频的每一帧的信息(pts dts..)
ffprobe -show_frames -select_streams v[/a] -of json INPUT.mp4 > OUTPUT.txt

//把视频或码流输出成每一张jpg
ffmpeg -i  INPUT.mp4  -pix_fmt rgb24  OUTPUT_%d.jpg"  

//把视频或码流输出成每一张yuv (segment_time < 1/fps)
ffmpeg -i  INPUT.mp4   -f segment -segment_time 0.01 OUTPUT_%d.yuv

//从视频中提取PCM
ffmpeg -i INTPUT.mp4 -vn -ar 44100 -ac 2 -f s16le OUTPUT.pcm 

//从MP3提取44.1khz 16位 pcm数据
ffmpeg -i INTPUT.mp3 -f s16le -ar 44100 -acodec pcm_s16le OUTPUT.pcm

//从MP3提取原始配置的pcm数据,转换为s16 (声卡支持该格式)、小端格式的PCM文件
ffmpeg -i INTPUT.mp3 -f s16le OUTPUT.pcm

//MP3 转wav
ffmpeg -i INTPUT.mp3 OUTPUT.wav

// 查看MP3 pcm数据的采样率以及数据格式相关信息
ffprobe -i INTPUT.mp3(INTPUT.pcm) -show_streams -select_streams a

//播放pcm,采样频率:44100 通道数:2 采样位数:16
ffplay -ac 2 -ar 44100 -f s16le OUTPUT.pcm ( ffplay -f s16le -ar 44100 -ac 2 OUTPUT.pcm)

// 播放时显示PB帧宏块运动方向
ffplay -x 1000 -y 1000   -flags2 +export_mvs INPUT.mp4 -vf codecview=mv=pf+bf+bb

 //剪切视频 -ss 开始时间 -t 持续时间(h : m : s->00:00:00)
ffmpeg -ss 0:1:30 -t 0:0:20 -i INPUT.mp4 -vcodec copy -acodec copy OUTPUT.mp4

// 旋转视频,可能要被裁剪
ffmpeg -i INPUT.mp4 -vf rotate=PI/2 OUTPUT.mp4 

// 顺时针旋转视频90度
ffmpeg -i INPUT.mp4 -vf "transpose=1" OUTPUT.mp4 

// 逆时针旋转视频90度
ffmpeg -i INPUT.mp4 -vf "transpose=2" OUTPUT.mp4 

// 顺时针旋转视频两次90度
ffmpeg -i INPUT.mp4 -vf "transpose=1,transpose=1" OUTPUT.mp4 

// 视频添加文本水印(fontfile:字体类型,text:要添加的文字内容,fontsize:字体大小,fontcolor:字体颜色)
ffmpeg -i INPUT.mp4 -vf drawtext="fontfile=stlitl.ttf:x=1:y=1:fontsize=50:text='Mingzz'" OUTPUT.mp4
 
// 视频添加静态图片水印([n:v]表示第n+1个-i参数输入的文件,[scale]为对第n+1个文件的操作结果
ffmpeg -i INPUT.jpg -i INPUT.mp4 -filter_complex "[0:v]scale=50:50[scale],[1:v][scale]overlay=400:400" OUTPUT.mp4

//如以rtmp推送到nginx
ffmpeg -re -i INPUT.mp4 -c copy -f flv [rtmp地址](如:rtmp://ifast3.vipnps.vip:19837/harman_live/mingzz)

// ffplay播放rtmp资源
ffplay [rtmp地址](如:rtmp://ifast3.vipnps.vip:19837/harman_live/mingzz)

//查看Nal Unit,Slice等信息
ffmpeg -i INPUT.h264 -c copy -bsf:v trace_headers -f null -

//图片缩放为原图的1/2
ffmpeg -i  INPUT.png  -vf "scale=iw/2:ih/2" OUTPUT.png

//从MP4中提取音频数据编码成MP3(-vn[no video], -b:a[码率], -ar[采样率], -ac[通道数], -acodec[指定编码名], -y[覆盖输出] )
ffmpeg -i INPUT.mp4 -vn -b:a 256k -ar 44100 -ac 2 -acodec libmp3lame -y OUTPUT.mp3

//拼接相同视频成一个视频 (n : 拼接次数)
ffmpeg  -stream_loop  n   -i  INPUT.mp4  -c  copy  OUTPUT.mp4

FFmpeg Android交叉编译脚本

#!/bin/sh

NDK=/home/gms/zzm/NDK/android-ndk-r24
#arm64-v8a
ARCH=aarch64
#min support api level
API=21 
OUTPUT=$(pwd)/android/out #lib output:/home/gms/zzm/FFmpeg/ffmpeg/android/out
#ndk cross compile tool path
TOOLCHAIN=/home/gms/zzm/NDK/android-ndk-r24/toolchains/llvm/prebuilt/linux-x86_64

#如果编译要引入x264需要连接x264库和头文件
x264_LIB = /xxx/xxxx/ABI/lib
x264_INCLUDE = /xx/xx/ABI/include 

#如果想编入x264以及Android MediaCodec,分别在配置编译参数有添加相应提示
#"x264 needed " , "MediaCodec needed" 不过x264和mediacodec好像有冲突
#当有mediacodec编译进去的时候,找h264编码器会找到mediacodec而不是x264
build() {
  ./configure \
  --target-os=android \
  --prefix=$OUTPUT \
  --arch=$ARCH \
  --sysroot=$TOOLCHAIN/sysroot \
  --disable-static \
  --disable-ffmpeg \
  --disable-ffplay \
  --disable-ffprobe \
  --pkg-config="pkg-config --static" \ //x264 need
  --pkgconfigdir=/usr/share/pkgconfig \ //x264 need(需要把x264编译好生成的x264.pc拷贝到此配置目录)
  --enable-libx264 \ //x264 need
  --enable-encoder=libx264 \ //x264 need
  --enable-gpl \ //x264 need
  --enable-hwaccels \ //MediaCodec needed
  --enable-jni \ //MediaCodec needed
  --enable-mediacodec \ //MediaCodec needed
  --enable-decoder=h264_mediacodec \ //MediaCodec needed
  --enable-encoder=h264_mediacodec \ //MediaCodec needed
  --enable-decoder=hevc_mediacodec \ //MediaCodec needed
  --enable-encoder=hevc_mediacodec \ //MediaCodec needed
  --enable-pic \
  --disable-debug \
  --disable-doc \
  --disable-avdevice \
  --enable-shared \
  --enable-cross-compile \
  --cross-prefix=$TOOLCHAIN/bin/llvm- \
  --cc=$TOOLCHAIN/bin/aarch64-linux-android$API-clang \
  --cxx=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++ \
  --extra-cflags="-fpic -I$x264_INCLUDE" \ //x264 need(-I$x264_INCLUDE)
  --extra-ldflags="-L$x264_LIB"  //x264 need(-L$x264_LIB)
  make clean all
  make -j8
  make install  
}

build

x264交叉编译脚本

#!/bin/sh

export NDK_PATH=/home/gms/zzm/AndroidStudio/SDK/ndk/21.4.7075529
export SYSROOT=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64/sysroot
export TOOLCHAIN=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64
export NDK_API=30
#32
exprot OUT_PATH_32=/home/gms/zzm/x264/x264/out/armeabi-v7a/
#64
export OUT_PATH_64=/home/gms/zzm/x264/x264/out/arm64-v8a/
#32
export HOST_32=armv7a-linux-android
#64
export HOST_64=aarch64-linux-android
#32
export TARGET_32=armv7a-linux-android
#64
export TARGET_64=aarch64-linux-android
#32
export CC_32=$TOOLCHAIN/bin/$TARGET_32$NDK_API-clang
export CXX_32=$TOOLCHAIN/bin/$TARGET_32$NDK_API-clang++
export CROSS_PREFIX_32=$TOOLCHAIN/bin/arm-linux-androideabi-
#64
export CC_64=$TOOLCHAIN/bin/$TARGET_32$NDK_API-clang
export CXX_64=$TOOLCHAIN/bin/$TARGET_64$NDK_API-clang++
export CROSS_PREFIX_64=$TOOLCHAIN/bin/aarch64-linux-android-
./configure \
--prefix=$OUT_PATH_64 \
--disable-cli \
--enable-shared \
--enable-static \
--enable-pic \
--host=$HOST_64 \
--cross-prefix=$CROSS_PREFIX_64 \
--sysroot=$SYSROOT \
make clean
make -j12
make install


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值