Android随手录#FFmpeg-->交叉编译,常见命令使用
Download
- Windows : ffmpeg tools exe下载
- 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
ARCH=aarch64
API=21
OUTPUT=$(pwd)/android/out
TOOLCHAIN=/home/gms/zzm/NDK/android-ndk-r24/toolchains/llvm/prebuilt/linux-x86_64
x264_LIB = /xxx/xxxx/ABI/lib
x264_INCLUDE = /xx/xx/ABI/include
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
exprot OUT_PATH_32=/home/gms/zzm/x264/x264/out/armeabi-v7a/
export OUT_PATH_64=/home/gms/zzm/x264/x264/out/arm64-v8a/
export HOST_32=armv7a-linux-android
export HOST_64=aarch64-linux-android
export TARGET_32=armv7a-linux-android
export TARGET_64=aarch64-linux-android
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-
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