跳到主要内容

FFmpeg杂记

阅读量

0

阅读人次

0

使用帮助

FFmpeg的帮助信息还是挺全的,结合 help 指令以及帮助文档应该能够释疑我们平常使用遇到的绝大部分问题。

FFmpeg 的 help 指令,能够输出很多有用的信息,输入 ffmpeg -h 能够看到以下输出:

......篇幅限制,内容仅截取部分......
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
Getting help:
-h -- print basic options
See man ffmpeg for detailed description of the options.

Print help / information / capabilities:
-L show license
-h topic show help
--help topic show help
-pix_fmts show available pixel formats
-sample_fmts show available audio sample formats
-colors show available color names

Global options (affect whole program instead of just one file):
-loglevel loglevel set logging level
-v loglevel set logging level

Video options:
-vframes number set the number of video frames to output
-r rate set frame rate (Hz value, fraction or abbreviation)

Audio options:
-aframes number set the number of audio frames to output
-aq quality set audio quality (codec-specific)

例如我们想知道 FFmpeg 支持哪些像素格式, ffmpeg -pix_fmts 就能告诉我们。

UVC

ffmpeg播放USB摄像头

在Windows下,FFmpeg是通过DirectShow来打开USB摄像头的。

ffplay -f dshow video="Logi C270 HD WebCam"
ffmpeg -f dshow -i video="Logi C270 HD WebCam" camera.mp4

推流

ffmpeg -f dshow -i video="Logi C270 HD WebCam":audio="麦克风 (Logi C270 HD WebCam)" -vcodec libx264 -acodec libvo_aacenc -preset:v ultrafast -tune:v zerolatency -f rtsp rtmp://192.168.1.85:8554/test

常用命令

从音频文件(例如 mp3、flac)中提取 pcm :

ffmpeg -i demo.mp3 -f s16le -acodec pcm_s16le -ar 16000 -ac 1 output.pcm

将 16kHz、16bit、1通道的 pcm 音频文件转换为 48kHz、16bit、2通道的 pcm 音频文件:

ffmpeg -f s16le -ar 16000 -ac 1 -i input.pcm -f s16le -ar 48000 -ac 2 output.pcm

将 8kHz、16bit、1通道的 pcm 音频文件转换为 16kHz、16bit、1通道的 pcm 音频文件:

ffmpeg -f s16le -ar 8000 -ac 1 -i input.pcm -f s16le -ar 16000 -ac 1 output.pcm

ffmpeg将一个1通道mp3文件,转换为 2通道,16bit,16000采样率的pcm文件,但是左通道数据为静音:

# 左通道静音
ffmpeg -i 20200316_1900.mp3 -ac 2 -ar 16000 -filter_complex "[0:a]pan=stereo|c0=0*c0|c1=1*c0[a]" -map "[a]" -f s16le -acodec pcm_s16le 20200316_1900.pcm

# 右通道静音
ffmpeg -i 20200316_1900.mp3 -ac 2 -ar 16000 -filter_complex "[0:a]pan=stereo|c0=1*c0|c1=0*c0[a]" -map "[a]" -f s16le -acodec pcm_s16le 20200316_1900.pcm

重定向日志输出

使用av_log_set_callback()

void ffmpegLogCallback(void *avcl, int level, const char *fmt, va_list vl) {
if (level == AV_LOG_VERBOSE) return; // 日志太多不打印
char buffer[2048] = {0};
vsnprintf(buffer, sizeof(buffer), fmt, vl);
if ((level == AV_LOG_FATAL) || (level == AV_LOG_PANIC)) {
LOG_CAT(fatal, FFmpeg) << buffer;
} else if (level == AV_LOG_ERROR) {
LOG_CAT(error, FFmpeg) << buffer;
} else if (level == AV_LOG_WARNING) {
LOG_CAT(warning, FFmpeg) << buffer;
} else if (level == AV_LOG_INFO) {
LOG_CAT(info, FFmpeg) << buffer;
} else {
LOG_CAT(info, FFmpeg) << "[" << level << "] " << buffer;
}
}

av_log_set_callback(&ffmpegLogCallback);