视频参数(流媒体系统,封装格式,视频编码,音频编码,播放器)对比

发现了几个视频参数对比的资源,是Wikipedia上的,总结的非常好:

流媒体系统对比:

http://en.wikipedia.org/wiki/Comparison_of_streaming_media_systems

封装格式对比:

http://en.wikipedia.org/wiki/Comparison_of_container_formats

视频编码器对比:

http://en.wikipedia.org/wiki/Comparison_of_video_codecs

音频编码格式对比:

http://en.wikipedia.org/wiki/Comparison_of_audio_formats

视频播放器对比:

http://en.wikipedia.org/wiki/Comparison_of_video_player_software

FFmpeg是一个开源的多媒体框架,它提供了许多对音视频的处理、编解码、封装等功能的API接口。下面是关于FFmpeg封装编码接口的介绍。 封装接口 FFmpeg封装的主要作用是将音视频数据打包成一个容器格式,例如AVI、MP4、MKV等。在FFmpeg中,封装的主要接口是AVFormatContext。通过AVFormatContext可以设置封装格式、音视频流的参数、写入数据等。 下面是一个简单的示例代码: ``` AVFormatContext *fmt_ctx = NULL; avformat_alloc_output_context2(&fmt_ctx, NULL, NULL, filename); if (!fmt_ctx) { // error handling } // 添加视频流 AVStream *video_stream = avformat_new_stream(fmt_ctx, NULL); if (!video_stream) { // error handling } video_stream->codecpar->codec_id = AV_CODEC_ID_H264; video_stream->codecpar->width = width; video_stream->codecpar->height = height; video_stream->codecpar->format = AV_PIX_FMT_YUV420P; // 添加音频流 AVStream *audio_stream = avformat_new_stream(fmt_ctx, NULL); if (!audio_stream) { // error handling } audio_stream->codecpar->codec_id = AV_CODEC_ID_AAC; audio_stream->codecpar->sample_rate = sample_rate; audio_stream->codecpar->channels = channels; audio_stream->codecpar->channel_layout = av_get_default_channel_layout(channels); // 打开输出文件 avio_open(&fmt_ctx->pb, filename, AVIO_FLAG_WRITE); avformat_write_header(fmt_ctx, NULL); // 写入数据 AVPacket pkt = { 0 }; av_init_packet(&pkt); // 写入视频数据 avcodec_send_frame(video_codec_ctx, frame); while (avcodec_receive_packet(video_codec_ctx, &pkt) == 0) { av_write_frame(fmt_ctx, &pkt); av_packet_unref(&pkt); } // 写入音频数据 avcodec_send_frame(audio_codec_ctx, frame); while (avcodec_receive_packet(audio_codec_ctx, &pkt) == 0) { av_write_frame(fmt_ctx, &pkt); av_packet_unref(&pkt); } // 关闭输出文件 av_write_trailer(fmt_ctx); avformat_free_context(fmt_ctx); ``` 在上面的代码中,我们首先创建了一个AVFormatContext对象,并设置了要输出的文件名和封装格式。然后,我们添加了一个视频流和一个音频流,并设置了它们的参数。接着,我们打开了输出文件,并使用avformat_write_header()函数写入文件头。最后,我们使用av_write_frame()函数将编码后的数据写入文件,并使用av_write_trailer()函数结束文件的写入。 编码接口 FFmpeg的编码接口主要用于将原始音视频数据编码成压缩格式,例如H.264、AAC等。在FFmpeg中,编码的主要接口是AVCodecContext。通过AVCodecContext可以设置编码器类型、编码参数、输入数据等。 下面是一个简单的示例代码: ``` AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264); if (!codec) { // error handling } AVCodecContext *codec_ctx = avcodec_alloc_context3(codec); if (!codec_ctx) { // error handling } codec_ctx->width = width; codec_ctx->height = height; codec_ctx->framerate = { fps, 1 }; codec_ctx->pix_fmt = AV_PIX_FMT_YUV420P; codec_ctx->time_base = { 1, fps }; codec_ctx->gop_size = 10; codec_ctx->bit_rate = 1000000; avcodec_open2(codec_ctx, codec, NULL); AVFrame *frame = av_frame_alloc(); if (!frame) { // error handling } frame->width = width; frame->height = height; frame->format = AV_PIX_FMT_YUV420P; av_frame_get_buffer(frame, 0); AVPacket pkt = { 0 }; av_init_packet(&pkt); // 填充视频帧数据 ... avcodec_send_frame(codec_ctx, frame); while (avcodec_receive_packet(codec_ctx, &pkt) == 0) { // 处理编码后的数据 av_packet_unref(&pkt); } ``` 在上面的代码中,我们首先使用avcodec_find_encoder()函数查找H.264编码器。然后,我们创建了一个AVCodecContext对象,并设置了编码器的参数。接着,我们使用avcodec_open2()函数打开编码器。接下来,我们创建了一个AVFrame对象,并使用av_frame_get_buffer()函数分配内存。最后,我们使用avcodec_send_frame()函数将原始数据发送给编码器,并使用avcodec_receive_packet()函数获取编码后的数据。 总结 FFmpeg提供了许多封装编码、解码等功能的API接口,可以方便地进行音视频处理。在使用FFmpeg进行封装编码时,需要了解AVFormatContext和AVCodecContext等对象的使用方法,并根据具体的需求进行参数的设置。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值