FFmpeg使用总结

1. FFmpeg常用命令

1.1 整体流程

FFmpeg使用总结

1.2 常用命令分类

FFmpeg使用总结

1.2.1 基本信息查询命令

FFmpeg使用总结

1.2.2 录制命令

  1. 录制视频
ffmpeg -f avfoundation -r 30 -i 0 out.yuv
  1. 录制音频
ffmpeg -f avfoundation -i :0 out.pcm
  1. 音视频同时录制
ffmpeg -f avfoundation -r 30 -i 0:0 out.mp4

1.2.3 分解/复用命令

ffmpeg -i test.mp4 -c copy test.flv
# 同样的效果
ffmpeg -i test.mp4 -acodec copy -vcodec copy test.flv
ffmpeg -i test.mp4 -c:a copy -c:v copy test.flv

1.2.4 处理原始数据命令

  1. 抽取视频
ffmpeg -i test.mp4 -an -c:v rawvideo test.yuv
  1. 抽取音频
ffmpeg -i test.mp4 -vn -ar 44100 -ac 2 -f s16le test.pcm

1.2.5 裁剪/合并命令

  1. 裁剪命令
ffmpeg -i test.mp4 -ss 00:00:01 -t 10 test_ss1.mp4
  1. 合并命令
#input.txt文件
file 'test_ss1.mp4'
file 'test_ss2.mp4'
#合并命令
ffmpeg -f concat -i input.txt test_cc.mp4

1.2.6 视频/图片转换命令

  1. 视频转图片
ffmpeg -i test.mp4 -f image2 image_%3d.jpeg
  1. 图片转视频
ffmpeg -i image_%3d.jpeg test_img.mp4

1.2.7 直播相关命令

  1. 拉流
ffmpeg -i rtmp://58.200.131.2:1935/livetv/cctv1 -c copy test_rtmp.mp4
  1. 拉流
ffmpeg -re -i test_rtmp.mp4 -c copy -f flv rtmp//:localhost/live/room

1.2.8 滤镜相关命令

裁剪画面

ffmpeg -i test.mp4 -vf crop=in_h-400:in_w-900 test_crop.mp4

2. FFmpeg初级使用

2.1 文件操作


void ffmpeg_test() {
    av_log_set_level(AV_LOG_DEBUG);
    AVIODirContext *dir_ctx = NULL;
    AVIODirEntry *next = NULL;
    //打开目录
    avio_open_dir(&dir_ctx, "/Users/mac/AVTest", NULL);
    //获取目录信息
    int count = 0;
    while (avio_read_dir(dir_ctx, &next)) {       
        //打印目录信息
        if(!next) {
            break;
        }
        av_log(NULL, AV_LOG_DEBUG, "%s    %lld\n", next->name, next->size);
    }

    //删除文件
    avpriv_io_delete("/Users/mac/AVTest/test.flv");
    //重命名文件
    avpriv_io_move("/Users/mac/AVTest/test.pcm", "/Users/mac/AVTest/tt.pcm");
}

2.2 抽取音频

  1. 相关API
//输出文件的流信息
void av_dump_format(AVFormatContext *ic,
                    int index,
                    const char *url,
                    int is_output);
//找到最合适的流数据                   
int av_find_best_stream(AVFormatContext *ic,
                        enum AVMediaType type,
                        int wanted_stream_nb,
                        int related_stream,
                        AVCodec **decoder_ret,
                        int flags);
  1. 实例
void cut_audio() {
    AVFormatContext *fmt_ctx = NULL;
    const char *src_path = "/Users/mac/AVTest/test.mp4";
    const char *dst_path = "/Users/mac/AVTest/test.aac";
    FILE *dst_fd = NULL;
    AVPacket *packet NULL;
    int ret = -1;
    
    /*输出文件的信息*/
    avdevice_register_all();
    //打开音频文件
    avformat_open_input(&fmt_ctx, src_path, NULL, NULL);
    av_dump_format(fmt_ctx, 0, src_path, 0);
    //选择最合适的流
    ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
    //读取数据流
    dst_fd = fopen(dst_path, "wb+");
    packet = av_packet_alloc();
    av_init_packet(packet);
    while (0 == av_read_frame(fmt_ctx, packet)) {
        //转存入文件
        char szAdtsHeader[ADTS_HEADER_LEN] = {0};
        
        adts_header(szAdtsHeader, packet->size);
        fwrite(szAdtsHeader, 1, ADTS_HEADER_LEN, dst_fd);
        fwrite(packet->data, 1, packet->size, dst_fd);
    }
    fclose(dst_fd);
    avformat_close_input(&fmt_ctx);
    av_packet_free(&packet); 
}

3. FFmpeg进阶开发

4. FFmpeg实现播放器

上一篇:输出ppm文件有误,无法显示


下一篇:科普:QUIC协议原理分析