让ffmpeg支持RMVB解码

合集下载

ffmpeg编解码流程

ffmpeg编解码流程

FFmpeg编解码流程一、简介FFmpeg是一个开源跨平台的音视频处理工具,它提供了一套完整的音视频编解码解决方案。

本文将深入探讨FFmpeg的编解码流程,重点介绍其原理和各个步骤。

二、FFmpeg编解码流程概述FFmpeg的编解码过程可以分为以下几个步骤: 1. 读取输入文件 2. 解封装 3. 视频/音频解码 4. 音视频处理 5. 视频/音频编码 6. 封装输出文件下面将逐一介绍每个步骤的具体内容。

2.1 读取输入文件编解码过程的第一步是读取输入文件。

FFmpeg支持多种音视频格式,可以通过指定输入格式来读取不同类型的文件。

通过读取输入文件,FFmpeg可以获取到音视频的基本信息。

2.2 解封装解封装是将输入文件中的音视频数据提取出来的过程。

FFmpeg支持各种常见的封装格式,如AVI、MP4、FLV等。

解封装的目的是将音视频数据从封装格式中分离出来,方便后续的解码和处理。

2.3 视频/音频解码解码是将音视频数据从原始的二进制数据转换为可读取的格式的过程。

FFmpeg支持的视频解码器包括H.264、H.265、MPEG-4等,音频解码器包括AAC、MP3、WAV 等。

解码过程中,FFmpeg将原始数据解析成具体的像素、采样等信息,以供后续处理使用。

2.4 音视频处理音视频处理是对解码后的音视频数据进行各种处理操作的过程。

包括视频的裁剪、旋转、缩放、滤镜效果的添加等,音频的混音、音量调整、变速变调等。

FFmpeg 提供了丰富的滤镜效果和处理函数,可以满足各种需求。

2.5 视频/音频编码编码是将处理后的音视频数据重新转换为压缩格式的二进制数据的过程。

FFmpeg 支持的视频编码器包括H.264、H.265、MPEG-4等,音频编码器包括AAC、MP3、WAV等。

编码过程中,FFmpeg将处理后的音视频数据压缩成较小的体积,减少文件的大小。

2.6 封装输出文件封装输出文件是将编码后的音视频数据重新封装为指定格式的文件的过程。

ffmpeg 各种编码器 使用方法

ffmpeg 各种编码器 使用方法

一、介绍ffmpeg编码器ffmpeg是一个开源的音视瓶处理工具,可以进行音视瓶的编解码、转换和流媒体的处理。

在使用ffmpeg进行编码时,我们可以选择不同的编码器来实现不同的功能,比如压缩、转换、解码等。

本文将介绍一些常见的编码器,并说明它们的使用方法。

二、常见的音频编码器1. AAC编码器AAC(Advanced Audio Coding)是一种高级音频编码格式,常用于音乐和音频流媒体的编码。

在ffmpeg中,可以使用libfaac库来支持AAC编码,具体命令如下:ffmpeg -i input.wav -c:a libfaac -b:a 128k output.aac参数说明:-i input.wav:指定输入文件为input.wav-c:a libfaac:选择使用libfaac库进行音频编码-b:a 128k:设置音频比特率为128kbpsoutput.aac:指定输出文件为output.aac2. MP3编码器MP3(MPEG-1 Audio Layer 3)是一种广泛使用的有损音频压缩格式,适用于音乐和语音的编码。

在ffmpeg中,可以使用libmp3lame库来支持MP3编码,具体命令如下:ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3参数说明:-i input.wav:指定输入文件为input.wav-c:a libmp3lame:选择使用libmp3lame库进行音频编码-q:a 2:设置音频质量因子为2(取值范围0-9,数值越大,音质越低)output.mp3:指定输出文件为output.mp3三、常见的视瓶编码器1. H.264编码器H.264(又称AVC)是一种高效的视瓶编码格式,适用于视瓶会议、高清电视等场景。

在ffmpeg中,可以使用libx264库来支持H.264编码,具体命令如下:ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slowoutput.mp4参数说明:-i input.mp4:指定输入文件为input.mp4-c:v libx264:选择使用libx264库进行视瓶编码-crf 23:设置视瓶质量因子为23(取值范围0-51,数值越小,视瓶质量越高)-preset slow:设置编码速度为slow(速度越慢,压缩效率越高)output.mp4:指定输出文件为output.mp42. H.265编码器H.265(又称HEVC)是一种更高效的视瓶编码格式,可以实现更好的压缩效果和视瓶质量。

ffmpeg编解码流程

ffmpeg编解码流程

ffmpeg编解码流程FFmpeg是一个开源的跨平台音视频处理工具,它可以对音视频进行编解码、转码、剪辑、合并等操作。

在使用FFmpeg进行音视频处理时,了解其编解码流程是非常重要的。

FFmpeg的编解码流程可以分为三个阶段:输入、处理和输出。

在输入阶段,FFmpeg会读取输入文件或者从摄像头、麦克风等设备中获取音视频数据。

在处理阶段,FFmpeg会对音视频数据进行解码、滤镜处理、编码等操作。

在输出阶段,FFmpeg会将处理后的音视频数据写入输出文件或者推送到网络上。

具体来说,FFmpeg的编解码流程如下:1. 输入阶段在输入阶段,FFmpeg会根据输入文件的格式选择相应的解封装器(demuxer)进行解封装,将音视频数据从容器格式中提取出来。

如果输入文件是网络流或者来自摄像头、麦克风等设备,FFmpeg 会使用相应的输入设备进行数据采集。

2. 处理阶段在处理阶段,FFmpeg会对音视频数据进行解码、滤镜处理、编码等操作。

首先,FFmpeg会根据音视频数据的编码格式选择相应的解码器(decoder)进行解码,将压缩后的数据解压成原始数据。

然后,FFmpeg会对解码后的数据进行滤镜处理,如添加水印、调整亮度、对比度等。

最后,FFmpeg会根据输出格式选择相应的编码器(encoder)进行编码,将处理后的数据压缩成指定格式的音视频数据。

3. 输出阶段在输出阶段,FFmpeg会将处理后的音视频数据写入输出文件或者推送到网络上。

如果输出文件是容器格式,FFmpeg会选择相应的封装器(muxer)进行封装,将音视频数据打包成容器格式。

如果输出文件是网络流,FFmpeg会使用相应的输出协议(protocol)将音视频数据推送到网络上。

FFmpeg的编解码流程包括输入、处理和输出三个阶段,每个阶段都有相应的解封装器、解码器、滤镜、编码器、封装器和输出协议可供选择。

了解FFmpeg的编解码流程可以帮助我们更好地使用它进行音视频处理。

ffmpeg

ffmpeg

ffmpeg.dll使用方法ffmpeg.dll是一个开源的多媒体框架,能够进行音频和视频的编码、解码、转换、合并等操作。

使用ffmpeg.dll可以实现许多常用的多媒体处理功能,如视频格式转换、视频剪辑、音频提取等。

下面将介绍一些常见的使用ffmpeg.dll实现多媒体处理的方法:1. 转码解码:使用ffmpeg.dll可以将一个格式的视频或音频文件转换成另一个格式。

首先需要调用av_register_all()函数进行初始化,然后通过avformat_open_input()函数打开输入文件,使用avformat_find_stream_info()函数查找音视频流信息。

接着可以通过avcodec_find_decoder()函数找到对应的解码器,并使用avcodec_open2()函数打开解码器。

最后使用av_read_frame()函数读取音视频帧数据进行解码。

对于音频文件的处理,可以使用avcodec_find_encoder()函数找到编码器,并使用avcodec_open2()函数打开编码器,然后使用av_encode_audio()函数对音频帧数据进行编码。

2. 视频剪辑合并:使用ffmpeg.dll可以进行视频的剪辑和合并。

首先需要解析输入的视频文件,获取视频的时间长度。

然后根据开始时间和结束时间截取需要的视频段,使用avcodec_find_encoder()函数找到对应的编码器,并使用avcodec_open2()函数打开编码器。

然后使用av_encode_video()函数对视频帧数据进行编码,将编码后的帧数据写入输出文件中。

3. 视频水印添加:使用ffmpeg.dll可以给视频添加水印。

首先需要解析输入的视频文件,并获取到视频的帧数据。

然后使用avcodec_find_encoder()函数找到对应的编码器,并使用avcodec_open2()函数打开编码器。

接着可以创建一个透明的图片,将图片数据和视频帧数据进行合成,得到带有水印的视频帧数据。

rmvb 在ffmpeg的解释

rmvb 在ffmpeg的解释

rmvb 在ffmpeg的解释
在FFmpeg中,RMVB是一种视频文件格式,它使用Real Networks的Real Media格式(通常简称为RM)作为容器,并使用可变比特率(VBR)编码来压缩视频和音频数据。

RMVB是Real Media格式的一种变体,它支持更高的视频质量和更好的音频质量。

FFmpeg是一个开源的多媒体处理工具,可以用于处理各种视频和音频格式,包括RMVB。

通过FFmpeg,您可以转换RMVB文件到其他格式,例如AVI、MPEG、WMV等,或者提取音频和字幕轨道。

您还可以使用FFmpeg对RMVB文件进行编辑和转码,以满足您的特定需求。

要使用FFmpeg处理RMVB文件,您可以使用以下命令行选项:
```bash
ffmpeg -i input.rmvb output.avi
```
上述命令将把输入的RMVB文件(input.rmvb)转换为AVI格式的输出文件(output.avi)。

您可以根据需要调整其他参数,例如比特率、帧率、分辨率等,以满足您的要求。

请注意,FFmpeg的RMVB支持取决于您的系统和安装的编解码器。

某些系统可能不支持RMVB格式或存在某些限制。

因此,在使用FFmpeg处理RMVB文件之前,请确保您的系统和编解码器支持RMVB格式,并仔细阅读FFmpeg文档以了解更多详细信息。

ffmpeg控制参数

ffmpeg控制参数

ffmpeg控制参数ffmpeg是一款强大的多媒体处理工具,通过控制参数可以实现各种视频和音频处理功能。

本文将介绍一些常用的ffmpeg控制参数及其用法,帮助读者更好地使用ffmpeg进行多媒体处理。

一、视频参数控制1. -r 参数:用于设置输出视频的帧率。

例如,使用命令“-r 30”表示输出视频的帧率为30帧/秒。

2. -s 参数:用于设置输出视频的分辨率。

例如,使用命令“-s 1280x720”表示输出视频的宽度为1280像素,高度为720像素。

3. -b:v 参数:用于设置输出视频的比特率。

比特率决定了视频的画质和文件大小。

例如,使用命令“-b:v 2000k”表示输出视频的比特率为2000kbps。

4. -c:v 参数:用于设置视频编码器。

ffmpeg支持多种视频编码器,如H.264、MPEG-4等。

例如,使用命令“-c:v libx264”表示使用libx264编码器进行视频编码。

二、音频参数控制1. -ar 参数:用于设置输出音频的采样率。

采样率决定了音频的音质和文件大小。

例如,使用命令“-ar 44100”表示输出音频的采样率为44100Hz。

2. -ac 参数:用于设置输出音频的声道数。

例如,使用命令“-ac 2”表示输出音频为立体声。

3. -b:a 参数:用于设置输出音频的比特率。

比特率决定了音频的音质和文件大小。

例如,使用命令“-b:a 128k”表示输出音频的比特率为128kbps。

4. -c:a 参数:用于设置音频编码器。

ffmpeg支持多种音频编码器,如AAC、MP3等。

例如,使用命令“-c:a aac”表示使用AAC编码器进行音频编码。

三、其他参数控制1. -ss 参数:用于设置从输入文件的哪个时间点开始处理。

例如,使用命令“-ss 00:01:30”表示从输入文件的1分30秒处开始处理。

2. -t 参数:用于设置处理的时长。

例如,使用命令“-t 10”表示处理10秒钟的视频或音频。

ffmpeg 硬件解码命令行参数

ffmpeg 硬件解码命令行参数

ffmpeg 硬件解码命令行参数
要使用FFmpeg进行硬件解码,你需要使用特定的命令行参数来
指定硬件解码器。

在大多数情况下,硬件解码通常是通过显卡的
GPU来实现的。

以下是一些常见的命令行参数示例:
1. 使用CUDA进行硬件解码:
bash.
ffmpeg -hwaccel cuda -i input.mp4 output.mp4。

这个命令使用CUDA进行硬件加速解码,输入文件是input.mp4,输出文件是output.mp4。

2. 使用OpenMAX进行硬件解码:
bash.
ffmpeg -c:v h264_omx -i input.mp4 -c:a copy output.mp4。

这个命令使用OpenMAX进行H.264视频的硬件解码,同时保持音频流不变,输入文件是input.mp4,输出文件是output.mp4。

3. 使用VAAPI进行硬件解码:
bash.
ffmpeg -vaapi_device /dev/dri/renderD128 -i input.mp4 -vf 'format=nv12,hwupload' -c:v h264_vaapi -b:v 5M -c:a copy output.mp4。

这个命令使用VAAPI进行H.264视频的硬件解码,并指定了输出的视频码率为5M,输入文件是input.mp4,输出文件是
output.mp4。

这些只是一些常见的示例,实际上硬件解码的命令行参数可能会因系统环境、硬件设备和FFmpeg版本而有所不同。

在使用硬件解码时,建议查阅FFmpeg官方文档以获取最新的命令行参数信息,并根据具体情况进行调整。

FFMPEG解码流程详细分析

FFMPEG解码流程详细分析

FFMPEG解码流程详细分析1.打开输入文件首先,FFMPEG需要通过avformat_open_input函数打开输入文件,并将文件名和文件格式传递给该函数。

该函数会根据文件格式创建一个对应的AVFormatContext结构体,用于存储文件的格式信息。

2.寻找媒体流3.寻找解码器在寻找媒体流的过程中,FFMPEG会遍历每一个流,并通过avcodec_find_decoder函数查找对应的解码器。

找到解码器后,会将解码器的ID存储在流的AVCodecParameters结构体中。

4.打开解码器通过avcodec_open2函数打开解码器。

该函数会为解码器分配内存空间,并初始化解码器的相关参数。

5.创建解码器上下文6.解码音视频帧7.输出解码后的帧解码器将解码后的音频帧或视频帧存储在AVFrame结构体中。

FFMPEG 可以通过av_hwframe_transfer_data函数将解码后的帧数据转换为指定硬件设备支持的格式。

8.后处理处理完解码后的帧数据后,可以进行各种后处理操作,如旋转、镜像、调整画面亮度和对比度等。

9.输出解码后的图像或音频通过音频输出设备、视频渲染器等方式将解码后的图像或音频进行播放或展示。

10.释放资源解码完成后,需要释放所有相关的资源。

关闭解码器、释放解码器上下文、关闭输入文件等操作。

以上是FFMPEG的解码流程详细分析,包括打开输入文件、寻找媒体流、寻找解码器、打开解码器、创建解码器上下文、解码音视频帧、输出解码后的帧、后处理、输出解码后的图像或音频以及释放资源等步骤。

这些步骤是FFMPEG解码过程中的关键环节,能够帮助开发者理解FFMPEG的内部工作原理。

ffmpeg解码流程

ffmpeg解码流程

ffmpeg解码流程FFmpeg是一款非常强大的开源多媒体框架,它可以将编码后的多媒体数据进行解码,从而进行音频或视频播放。

那么具体来说,FFmpeg的解码流程是怎样的呢?下面我们一步步地来看。

第一步:打开文件首先,我们需要使用FFmpeg提供的avformat_open_input函数打开要解码的文件,这个函数将会返回一个AVFormatContext结构体,它包含了打开文件的数据流,以及其他文件相关的信息。

第二步:查找流接着,我们需要使用FFmpeg提供的avformat_find_stream_info 函数,通过读取文件头信息来查找音频或视频数据流的信息,并且将这些信息存储在AVFormatContext结构体中。

第三步:查找解码器在确定了音频或视频数据流的类型之后,我们就需要确定使用哪个解码器来进行解码了。

FFmpeg提供了avcodec_find_decoder函数来查找可用于解码的解码器。

根据我们得到的音频或视频数据流信息,我们可以得知需要使用的解码器的类型。

第四步:打开解码器一旦我们找到了合适的解码器,我们就需要打开它了。

使用FFmpeg提供的avcodec_open2函数可以打开解码器,并将信息存储在AVCodecContext结构体中。

除此之外,我们还要检查一下是否解码器正常开启了。

第五步:读取数据帧现在我们已经准备好开始解码了。

使用FFmpeg提供的av_read_frame函数读取文件的一个数据帧,并将数据帧中的数据存储在AVPacket结构体中。

注意,一个数据帧可能包含多个音频或视频帧。

第六步:解码数据帧一旦我们获得了数据帧,我们就可以使用我们开启的解码器开始对数据帧进行解码了。

使用FFmpeg提供的avcodec_send_packet函数将之前存储的数据帧发送到解码器中。

之后,使用avcodec_receive_frame函数获取解码器解码后的数据帧。

第七步:处理解码后的数据最后,我们可以将解码后的数据帧用于音频或视频的处理了。

ffmpeg 编译选项 格式

ffmpeg 编译选项 格式

题目:ffmpeg编译选项解析正文:一、引言最近,随着视频处理技术的飞速发展,越来越多的开发者开始涉及到视频编解码和处理的工作。

而ffmpeg作为一个开源的跨评台多媒体处理工具,备受众多开发者的青睐。

在使用ffmpeg时,编译选项是非常重要的,它可以影响到ffmpeg的功能和性能表现。

学习ffmpeg的编译选项是十分必要的。

二、常见的ffmpeg编译选项1. --enable-libx264:这个选项用于启用libx264,libx264是一个优秀的H.264编码器,很多场景下都会用到。

2. --enable-libopus:这个选项用于启用libopus,libopus是一个优秀的音频编解码器,通常在音频处理领域会使用到。

3. --enable-libvpx:这个选项用于启用libvpx,libvpx是一个开源的VP8和VP9编解码器,适用于WebM格式。

4. --enable-gpl:这个选项用于启用GPL软件,一般情况下,如果你的项目是开源的,可以启用这个选项。

5. --enable-libfreetype:这个选项用于启用libfreetype,libfreetype是一个用于渲染文本的库,如果你需要在视频中加入文本,可以启用这个选项。

三、常用的ffmpeg编译选项详解1. --enable-libx264启用libx264后,ffmpeg就可以使用x264库进行H.264的编码和解码。

这个选项是非常常用的,因为H.264是目前应用最广泛的视频编码格式之一,例如在视频会议、在线直播等场景中,H.264都是非常常用的。

如果你的项目涉及到H.264编码解码,一般都会启用这个选项。

2. --enable-libopus启用libopus后,ffmpeg就可以使用opus库进行音频的编码和解码。

Opus是一种新型的可变比特率音频编解码器,它在音频通话、网络流媒体等场景中有着广泛的应用。

如果你的项目需要音频的处理,那么启用这个选项是非常必要的。

Java实现视频网站的视频上传、视频转码、及视频播放功能(ffmpeg)

Java实现视频网站的视频上传、视频转码、及视频播放功能(ffmpeg)

Java实现视频⽹站的视频上传、视频转码、及视频播放功能(ffmpeg)视频⽹站中提供的在线视频播放功能,播放的都是FLV格式的⽂件,它是Flash动画⽂件,可通过Flash制作的播放器来播放该⽂件.项⽬中⽤制作的player.swf播放器.多媒体视频处理⼯具FFmpeg有⾮常强⼤的功能包括视频采集功能、视频格式转换、视频抓图、给视频加⽔印等。

ffmpeg视频采集功能⾮常强⼤,不仅可以采集视频采集卡或USB摄像头的图像,还可以进⾏屏幕录制,同时还⽀持以RTP⽅式将视频流传送给⽀持RTSP的流媒体服务器,⽀持直播应⽤。

1.能⽀持的格式ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)2.不能⽀持的格式对ffmpeg⽆法解析的⽂件格式(wmv9,rm,rmvb等),可以先⽤别的⼯具(mencoder)转换为avi(ffmpeg能解析的)格式.实例是将上传视频转码为flv格式,该格式ffmpeg⽀持,所以我们实例中需要ffmpeg视频处理⼯具.数据库MySQL5.5实例所需要的数据库脚本drop database if exists db_mediaplayer;create database db_mediaplayer;use db_mediaplayer;create table tb_media(id int not null primary key auto_increment comment '主键' ,title varchar(50) not null comment '视频名称' ,src varchar(200) not null comment '视频存放地址' ,picture varchar(200) not null comment '视频截图' ,descript varchar(400) comment '视频描述' ,uptime varchar(40) comment '上传时间');desc tb_media;项⽬结构图:上传视频界⾯设计在上传⽂件时,Form表单中 enctype属性值必须为"multipart/form-data".模块界⾯设计如下图:enctype属性值说明application/x-www-form-urlencoded表单数据被编码为名称/值对,这是标准的编码格式multipart/form-data表单数据被编码为⼀条消息,页⾯上每个控件对应消息中的⼀部分text/plain表单数据以纯⽂本形式进⾏编码,其中不含任何控件格式的字符⾯向接⼝编程,接⼝中定义系统功能模块.这样⽅便理清业务,同时接⼝的对象必须由实现了该接⼝的对象来创建.这样就避免编码中的某些业务遗漏等,同时扩展性也增强了.package com.webapp.dao;import java.util.List;import com.webapp.entity.Media;/**** MediaDao.java** @version : 1.1** @author :苏若年 <a href="mailto:DennisIT@">发送邮件</a>** @since : 1.0 创建时间: 2013-2-07 上午10:19:54** TODO : interface MediaDao.java is used for ...**/public interface MediaDao {/*** 视频转码* @param ffmpegPath 转码⼯具的存放路径* @param upFilePath ⽤于指定要转换格式的⽂件,要截图的视频源⽂件* @param codcFilePath 格式转换后的的⽂件保存路径* @param mediaPicPath 截图保存路径* @return* @throws Exception*/public boolean executeCodecs(String ffmpegPath,String upFilePath, String codcFilePath, String mediaPicPath)throws Exception;/*** 保存⽂件* @param media* @return* @throws Exception*/public boolean saveMedia(Media media)throws Exception;/*** 查询本地库中所有记录的数⽬* @return* @throws Exception*/public int getAllMediaCount()throws Exception;/*** 带分页的查询* @param firstResult* @param maxResult* @return*/public List<Media> queryALlMedia(int firstResult, int maxResult)throws Exception;/*** 根据Id查询视频* @param id* @return* @throws Exception*/public Media queryMediaById(int id)throws Exception;}接⼝的实现,这⾥列出ffmpeg视频转码与截图模块/*** 视频转码* @param ffmpegPath 转码⼯具的存放路径* @param upFilePath ⽤于指定要转换格式的⽂件,要截图的视频源⽂件* @param codcFilePath 格式转换后的的⽂件保存路径* @param mediaPicPath 截图保存路径* @return* @throws ExceptionString mediaPicPath) throws Exception {// 创建⼀个List集合来保存转换视频⽂件为flv格式的命令List<String> convert = new ArrayList<String>();convert.add(ffmpegPath); // 添加转换⼯具路径convert.add("-i"); // 添加参数"-i",该参数指定要转换的⽂件convert.add(upFilePath); // 添加要转换格式的视频⽂件的路径convert.add("-qscale"); //指定转换的质量convert.add("6");convert.add("-ab"); //设置⾳频码率convert.add("64");convert.add("-ac"); //设置声道数convert.add("2");convert.add("-ar"); //设置声⾳的采样频率convert.add("22050");convert.add("-r"); //设置帧频convert.add("24");convert.add("-y"); // 添加参数"-y",该参数指定将覆盖已存在的⽂件convert.add(codcFilePath);// 创建⼀个List集合来保存从视频中截取图⽚的命令List<String> cutpic = new ArrayList<String>();cutpic.add(ffmpegPath);cutpic.add("-i");cutpic.add(upFilePath); // 同上(指定的⽂件即可以是转换为flv格式之前的⽂件,也可以是转换的flv⽂件)cutpic.add("-y");cutpic.add("-f");cutpic.add("image2");cutpic.add("-ss"); // 添加参数"-ss",该参数指定截取的起始时间cutpic.add("17"); // 添加起始时间为第17秒cutpic.add("-t"); // 添加参数"-t",该参数指定持续时间cutpic.add("0.001"); // 添加持续时间为1毫秒cutpic.add("-s"); // 添加参数"-s",该参数指定截取的图⽚⼤⼩cutpic.add("800*280"); // 添加截取的图⽚⼤⼩为350*240cutpic.add(mediaPicPath); // 添加截取的图⽚的保存路径boolean mark = true;ProcessBuilder builder = new ProcessBuilder();try {mand(convert);builder.redirectErrorStream(true);builder.start();mand(cutpic);builder.redirectErrorStream(true);// 如果此属性为 true,则任何由通过此对象的 start() ⽅法启动的后续⼦进程⽣成的错误输出都将与标准输出合并,//因此两者均可使⽤ Process.getInputStream() ⽅法读取。

编译支持MP3与H264编码的ffmpeg

编译支持MP3与H264编码的ffmpeg

编译支持MP3与H264编码的ffmpeg转自:编译支持MP3与H264编码的ffmpeg2013-10-03 17:47:00分类:LINUX编译支持MP3,H264编码的ffmpegffmpeg原有的系统中支持mp3和h264的解码,但是编码并不支持,所以,需要是应用第三方插件进行支持;从configure --help可以看出:首先系统中需要包含libx264与libmp3lame,这两个lib能够从对应的git中下载得到MP3编码对应web: /download.phplibx264对应Web:安装mp3编码库安装libx264编码库 孙悟空当安装的过程中遇到需要yasm的时候,可以--disabled-yasm,当然,并不建议disabled调,还是安装yasm更好一些如果需要支持h264与mp3的话,可以使用如下参数进行支持./configure --enable-libmp3lame --enable-libx264 --enable-gpl由于libx264的code有GPL信息,所以,支持libx264时,需要--enable-gpl,ffmpeg在license方面还是比我们国内的人更重视然后make&&make install即编译安装ffmpeg接下来可以试一下ok,生成完毕4100 output.mp42.3.ffmpeg version N-56530-g29f244e Copyright (c) 2000-20 13 the FFmpeg developers4.built on Sep 21 2013 16:41:16 with llvm-gcc 4.2.1 (LLVM b uild 2336.11.00)5.configuration: --enable-ffplay --enable-libmp3lame --ena ble-libx264 --enable-gpl6.libavutil 52. 45.100 / 52. 45.1007.libavcodec 55. 33.100 / 55. 33.1008.libavformat 55. 18.102 / 55. 18.1029.libavdevice 55. 3.100 / 55. 3.10010.libavfilter 3. 86.102 / 3. 86.10211.libswscale 2. 5.100 / 2. 5.10012.libswresample 0. 17.103 / 0. 17.10313.libpostproc 52. 3.100 / 52. 3.10014.Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':15.Metadata:16.major_brand : isom17.minor_version : 512patible_brands: isomiso2avc1mp4119.encoder : Lavf55.18.10220.Duration: 00:01:03.32, start: 0.021333, bitrate: 408 kb/s21.Stream #0:0(und): Video: h264 (High) (avc1 / 0x316376 61), yuv420p, 640x352 [SAR 1:1 DAR 20:11], 278 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)22.Metadata:23.handler_name : VideoHandler24.Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 48 000 Hz, stereo, fltp, 126 kb/s (default)25.Metadata:26.handler_name : SoundHandler27.File 'output.mp4' already exists. Overwrite ? [y/N] y28.[libx264 @ 0x7fc462030a00] using SAR=1/129.[libx264 @ 0x7fc462030a00] using cpu capabilities: M MX2 SSE2Fast SSSE3 SSE4.2 AVX30.[libx264 @ 0x7fc462030a00] profile High, level 3.031.[libx264 @ 0x7fc462030a00] 264 - core 130 r2274 c83 2fe9 - H.264/MPEG-4 AVC codec - Copyleft 2003-2013 - /x264.h tml - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_ran ge=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,1 1 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_thre ads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_c ompat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt =1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyin t=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead =40 rc=abr mbtree=1 bitrate=1200 ratetol=1.0 qcomp=0.60 qp min=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.0032.Output #0, mp4, to 'output.mp4':33.Metadata:34.major_brand : isom35.minor_version : 512patible_brands: isomiso2avc1mp4137.encoder : Lavf55.18.10238.Stream #0:0(und): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 640x352 [SAR 1:1 DAR 20:11], q=-1--1, 1200 kb/s, 12800 tbn, 25 tbc (default)39.Metadata:40.handler_name : VideoHandler41.Stream #0:1(und): Audio: mp3 (libmp3lame) (i[0][0][0] / 0x0069), 44100 Hz, stereo, fltp, 128 kb/s (default)42.Metadata:43.handler_name : SoundHandler44.Stream mapping:45.Stream #0:0 -> #0:0 (h264 -> libx264)46.Stream #0:1 -> #0:1 (aac -> libmp3lame)47.Press [q] to stop, [?] for help48.frame= 1568 fps=132 q=-1.0 Lsize= 13081kB time=00: 01:03.32 bitrate=1692.3kbits/s dup=1 drop=049.video:12033kB audio:990kB subtitle:0 global headers:0 kB muxing overhead 0.443282%50.[libx264 @ 0x7fc462030a00] frame I:10 Avg QP: 4.95 si ze: 3192651.[libx264 @ 0x7fc462030a00] frame P:559 Avg QP: 4.58 size: 1394152.[libx264 @ 0x7fc462030a00] frame B:999 Avg QP: 5.74 size: 421353.[libx264 @ 0x7fc462030a00] consecutive B-frames: 11. 0% 9.1% 9.6% 70.4%54.[libx264 @ 0x7fc462030a00] mb I I16..4: 48.3% 32.6% 19.1%55.[libx264 @ 0x7fc462030a00] mb P I16..4: 2.2% 5.6% 2. 9% P16..4: 20.3% 11.4% 8.9% 0.0% 0.0% skip:48.8%56.[libx264 @ 0x7fc462030a00] mb B I16..4: 0.1% 0.3% 0. 3% B16..8: 21.7% 5.6% 2.1% direct: 4.2% skip:65.8% L0:40.3% L1: 43.8% BI:15.9%57.[libx264 @ 0x7fc462030a00] final ratefactor: 6.6758.[libx264 @ 0x7fc462030a00] 8x8 transform intra:48.6% inter:46.3%59.[libx264 @ 0x7fc462030a00] coded y,uvDC,uvAC intra: 75.9% 71.3% 59.6% inter: 19.2% 15.8% 10.6%60.[libx264 @ 0x7fc462030a00] i16 v,h,dc,p: 65% 19% 9% 8%61.[libx264 @ 0x7fc462030a00] i8 v,h,dc,ddl,ddr,vr,hd,vl,h u: 25% 33% 13% 3% 4% 5% 6% 5% 6%62.[libx264 @ 0x7fc462030a00] i4 v,h,dc,ddl,ddr,vr,hd,vl,h u: 30% 37% 10% 3% 5% 4% 5% 3% 4%63.[libx264 @ 0x7fc462030a00] i8c dc,h,v,p: 46% 28% 19% 6%64.[libx264 @ 0x7fc462030a00] Weighted P-Frames: Y:10. 4% UV:4.8%65.[libx264 @ 0x7fc462030a00] ref P L0: 69.1% 15.4% 12. 1% 3.3% 0.1%66.[libx264 @ 0x7fc462030a00] ref B L0: 87.2% 11.8% 1.1%67.[libx264 @ 0x7fc462030a00] ref B L1: 95.3% 4.7%68.[libx264 @ 0x7fc462030a00] kb/s:1571.5869.[StevenLiu@liudeMacBook-Pro ffmpeg]$ ffmpeg -i out put.mp470.ffmpeg version N-56530-g29f244e Copyright (c) 2000 -2013 the FFmpeg developers71.built on Sep 21 2013 16:41:16 with llvm-gcc 4.2.1 (LLV M build 2336.11.00)72.configuration: --enable-ffplay --enable-libmp3lame --enable-libx264 --enable-gpl73.libavutil 52. 45.100 / 52. 45.10074.libavcodec 55. 33.100 / 55. 33.10075.libavformat 55. 18.102 / 55. 18.10276.libavdevice 55. 3.100 / 55. 3.10077.libavfilter 3. 86.102 / 3. 86.102。

利用ffmpeg来进行视频解码的完整示例代码(H.264)

利用ffmpeg来进行视频解码的完整示例代码(H.264)

利⽤ffmpeg来进⾏视频解码的完整⽰例代码(H.264)Decode(){FILE * inpf;int nWrite;int i,p;int nalLen;unsigned char* Buf;int got_picture, consumed_bytes;unsigned char *DisplayBuf;DisplayBuf=(unsigned char *)malloc(60000);char outfile[] = "test.pgm";//1.打开输⼊⽂件inpf = fopen("test.264", "rb");//outf = fopen("out.yuv", "wb");if(!inpf){goto Decodereturn;}nalLen = 0;Buf = (unsigned char*)calloc ( 1000000, sizeof(char)); //准备解码⽂件缓冲//2.注册解码器,并且找到H264解码器avcodec_init();avcodec_register_all();codec = avcodec_find_decoder(CODEC_ID_H264);if (!codec) {return 0;}//allocate codec context//分配解码器内存c = avcodec_alloc_context();if(!c){return 0;}//open codec//3.打开解码器if (avcodec_open(c, codec) < 0) {return 0;}//allocate frame buffer//分配解码器⽤的帧缓冲picture = avcodec_alloc_frame();if(!picture){return 0;}rgbdatanew = (unsigned char *)malloc(sizeof(unsigned char)*(3 * width * height));while(!feof(inpf)){//4.获取下⼀个NAL的长度,并且将NAL放⼊BufnalLen = getNextNal(inpf, Buf);//5.对改NAL解码,解码的YUV数据存在picture中consumed_bytes= avcodec_decode_video(c, picture, &got_picture, Buf, nalLen);if(consumed_bytes > 0){//6.将picture中的YUV数据显⽰或者保存到⽂件p=0;for(i=0; i<c->height; i++){memcpy(DisplayBuf+p,picture->data[0] + i * picture->linesize[0], c->width); p+=c->width;}for(i=0; i<c->height/2; i++){memcpy(DisplayBuf+p,picture->data[1] + i * picture->linesize[1], c->width/2); p+=c->width/2;}for(i=0; i<c->height/2; i++){memcpy(DisplayBuf+p,picture->data[2] + i * picture->linesize[2], c->width/2); p+=c->width/2;}//显⽰画⾯DisplayVideo(DisplayBuf);}}//7.关闭输⼊⽂件if(inpf)fclose(inpf);Decodereturn://8.关闭解码器,释放解码器内存if(c) {avcodec_close(c);av_free(c);c = NULL;}//9.释放解码画⾯内存if(picture) {av_free(picture);picture = NULL;}//10.释放解码⽂件缓冲if(Buf){free(Buf);Buf = NULL;}free(DisplayBuf);}。

ffmpeg编解码流程

ffmpeg编解码流程

ffmpeg编解码流程
一、FFmpeg简介
FFmpeg是一款开源的视频编解码软件,它支持超过一百种编码格式,包括视频格式AVI、MPEG、WMV、3GP和音频格式MP3、WMA、WAV等。

FFmpeg主要用于视频格式转换、视频编辑,也可用来对视频进行捕获和流传输。

二、FFmpeg编解码流程
1、定义流
为了支持不同文件格式,FFmpeg使用流对象来定义文件视频流,它将文件中的视频流数据封装成相应的流对象。

它保存视频流的头部及流中的音视频元素信息。

2、解码
解码就是从压缩的流中提取有用的信息,一般它会使用特定的编码格式,比如H.264、MPEG-4、VP9等,来解码视频流中的视频帧,以及解码音频流中的数据帧。

3、处理
处理就是对视频帧和音频帧进行各种操作,包括拼接、分割、剪辑、特效处理等,可以实现各种视频操作。

处理的结果就是视频流的形式化表示,也就是一个可以被编码器使用的视频数据流。

4、编码
编码就是将原始数据进行编码,比如H.264、MPEG-4等,以及音频的AAC等。

编码过程中,首先会对原始视频数据进行预处理,然后
会进行编码,编码过程中需要确定编码参数以实现最佳的压缩率和最佳的播放效果。

5、封装
最后就是封装,封装是把视频帧和音频帧封装成符合某种格式的文件格式,比如MP4、WMV等,以此来播放视频流。

FFmpeg支持各种封装格式,它可以根据每个流中的元素类型进行自动封装,以便实现稳定的播放体验。

ffmpeg实时解码原理

ffmpeg实时解码原理

ffmpeg实时解码原理
ffmpeg实时解码的原理主要包括以下几个步骤:
1. 解协议:将流媒体协议的数据解析为标准的封装格式数据。

在网络上传播的视音频数据通常采用各种流媒体协议,如HTTP、RTMP、MMS等。


些协议在传输视音频数据的同时,也会传输一些信令数据。

这些信令数据包括对播放的控制(播放、暂停、停止)和对网络状态的描述等。

解协议过程中会去除掉信令数据,只保留视音频数据。

2. 解封装:将输入的封装格式的数据分离成为音频流压缩编码数据和视频流压缩编码数据。

封装格式种类很多,例如MP4、MKV、RMVB、TS、FLV、AVI等,它的作用是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。

例如,FLV格式的数据,经过解封装操作后,输出编码的视频码流和AAC编码的音频码流。

3. 解码:将视频/音频压缩编码数据解码成为非压缩的视频/音频原始数据。

音频的压缩编码标准包含AAC、MP3、AC-3等,视频的压缩编码标准则包含、MPEG2、VC-1等。

解码是整个系统中最重要也是最复杂的一个环节。

通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如
YUV420P、RGB等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。

4. 视音频同步:根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

以上信息仅供参考,如需了解ffmpeg实时解码原理的更多信息,建议查阅ffmpeg相关书籍或咨询专业人士。

ffmpeg编码格式

ffmpeg编码格式

ffmpeg编码格式FFmpeg 是一个开源的多媒体处理工具,支持包括音频、视频、字幕等多种多媒体格式的编解码。

下面是一些常见的FFmpeg 支持的编码格式:1. 视频编码格式:- H.264(libx264):一种广泛使用的视频编码标准,常用于高清视频和在线视频流。

- H.265(libx265):也称为HEVC(High Efficiency Video Coding),是H.264 的继任者,具有更高的压缩效率。

- VP9:Google 开发的开放式视频编码格式,用于WebM 格式的视频。

- AV1:一种由Alliance for Open Media 开发的开放式视频编码格式,旨在提供更高的压缩效率。

2. 音频编码格式:- AAC(libfdk_aac):一种广泛使用的音频编码格式,通常用于存储和流媒体。

- MP3(libmp3lame):一种常见的音频编码格式,用于音乐和广播等领域。

- Opus:一种开放式的音频编码格式,旨在提供高质量的音频流。

- Vorbis:一种开放式的音频编码格式,通常用于Ogg 文件格式。

3. 容器格式:- MP4:一种常见的多媒体容器格式,支持视频、音频和字幕。

- MKV(Matroska):一种开放式的多媒体容器格式,支持包含多个音频、视频、字幕流的文件。

- WebM:一种开放式的多媒体容器格式,用于Web 视频,通常包含VP9 视频和Opus 音频。

- AVI:一种老旧的多媒体容器格式,仍然在一些场景中使用。

4. 字幕格式:- SRT(SubRip):一种简单的文本字幕格式,常用于存储和传输视频字幕。

- ASS/SSA:Advanced SubStation Alpha/SubStation Alpha,一种高级字幕格式,支持丰富的样式和效果。

上述列举的是一些常见的编码和容器格式,实际上FFmpeg 支持众多的编码和容器格式,具体支持的编解码器和容器格式取决于FFmpeg 编译时使用的配置。

使用ffmpeg实现对h264视频解码--(实现了一个易于使用的c++封装库)

使用ffmpeg实现对h264视频解码--(实现了一个易于使用的c++封装库)

使⽤ffmpeg实现对h264视频解码--(实现了⼀个易于使⽤的c++封装库)H264是当今流⾏的视频压缩格式;ffmpeg是⼀个开源库,实现了对h264视频⽂件的解压缩。

为了降低使⽤ffmpeg的复杂性,尽量隐藏实现细节,我写了⼀个封装库。

c#也可以很⽅便的使⽤此库。

解压后的数据可以为yuv格式,也可以为rgb格式。

同时可以对rgb格式视频做缩放。

类H264Decode实现了所有解码功能。

最后,再把此类封装成c函数,以便于与c#交互。

下⾯讲述⼀下此类的实现细节:1 BOOL H264Decode::Init()初始化解码库,打开h264解码器。

BOOL H264Decode::Init(){if (_init)return TRUE;_init = TRUE;if (!_av_register){_av_register = TRUE;av_register_all();}_pCodecContext = avcodec_alloc_context3(NULL);_pH264VideoDecoder = avcodec_find_decoder(AV_CODEC_ID_H264);if (_pH264VideoDecoder == NULL){return FALSE;}//初始化参数,下⾯的参数应该由具体的业务决定 AV_PIX_FMT_YUV420P;_pCodecContext->time_base.num = 1;_pCodecContext->frame_number = 1; //每包⼀个视频帧_pCodecContext->codec_type = AVMEDIA_TYPE_VIDEO;_pCodecContext->bit_rate = 0;_pCodecContext->time_base.den = 25;//帧率_pCodecContext->width = 0;//视频宽_pCodecContext->height = 0;//视频⾼_pCodecContext->pix_fmt = AV_PIX_FMT_YUVJ420P;_pCodecContext->color_range = AVCOL_RANGE_MPEG;if (avcodec_open2(_pCodecContext, _pH264VideoDecoder, NULL) >= 0)_pFrameYuv = av_frame_alloc();elsereturn FALSE;return TRUE;}2 向解码器输⼊数据INT32 H264Decode::H264_PutVideoStream(char* buffer, INT32 bufferLen){AVPacket packet = { 0 };packet.data = (uint8_t*)buffer; //这⾥填⼊⼀个指向完整H264数据帧的指针packet.size = bufferLen; //这个填⼊H264数据帧的⼤⼩int ret = avcodec_send_packet(_pCodecContext, &packet);return ret;}3 读取解压后的数据 yuv格式INT32 H264Decode::H264_GetNextVideoFrame(char* buffer, INT32 bufferLen, INT32 yuFormate){if (avcodec_receive_frame(_pCodecContext, _pFrameYuv) == 0){int height = _pCodecContext->height;int width = _pCodecContext->width;if (yuFormate == 1){////写⼊数据int yLen = height * width;memcpy(buffer, _pFrameYuv->data[0], yLen);int uLen = yLen / 4;memcpy(buffer + yLen, _pFrameYuv->data[1], uLen);int vLen = uLen;memcpy(buffer + yLen + uLen, _pFrameYuv->data[2], vLen);return0;}else{////写⼊数据int yLen = height * width;memcpy(buffer, _pFrameYuv->data[0], yLen);int uLen = yLen / 4;memcpy(buffer + yLen, _pFrameYuv->data[2], uLen);int vLen = uLen;memcpy(buffer + yLen + uLen, _pFrameYuv->data[1], vLen);return0;}}return -1;}4 获取RGB格式视频;可同时,根据需要的⼤⼩,对视频做缩放。

ffmpeg 解码流程

ffmpeg 解码流程

ffmpeg 解码流程FFmpeg是一个开源的跨平台音视频处理工具,它包含了众多编解码器、过滤器和工具,用于音视频的编解码、转换、处理等操作。

下面是FFmpeg的解码流程的简要概述:1.初始化:-创建AVFormatContext对象,用于管理输入媒体文件的相关信息。

-打开输入媒体文件,通过调用avformat_open_input函数。

2.获取流信息:-调用avformat_find_stream_info函数,解析输入媒体文件的数据流。

-获取音视频流的详细信息,如编解码器类型、时间基准等。

3.查找解码器:-遍历音视频流,通过调用avcodec_find_decoder函数查找合适的解码器。

-初始化解码器,通过调用avcodec_open2函数。

4.解码循环:-从输入媒体文件读取音视频帧,通过调用av_read_frame函数。

-根据帧所属的音视频流索引,将数据传递给相应的解码器进行解码,通过调用avcodec_send_packet和avcodec_receive_frame函数。

5.处理解码后的帧:-对于音频帧,可以直接处理解码后的音频数据。

-对于视频帧,可以进行色彩空间转换、缩放、滤镜处理等操作。

6.清理:-释放解码器资源,通过调用avcodec_close函数。

-关闭输入媒体文件,通过调用avformat_close_input函数。

-释放相关的内存空间。

以上是FFmpeg解码流程的基本步骤。

实际应用中,可能会涉及更多的细节和处理步骤,如处理音视频同步、处理字幕、音频重采样等。

具体的解码流程和操作可根据需求和具体情况进行调整和扩展。

ffmpeg编码库算法

ffmpeg编码库算法

ffmpeg编码库算法一、概述ffmpeg是一个广泛使用的视频和音频处理库,它提供了丰富的功能,包括视频编解码、音频编解码、流媒体传输等。

ffmpeg编码库算法是其核心组成部分,它提供了多种编解码算法,支持多种不同的视频和音频格式。

本文档将介绍ffmpeg编码库的主要算法。

二、视频编解码算法1. H.264/AVC编解码算法:H.264/AVC是当前最流行的视频编解码标准之一,ffmpeg支持H.264/AVC编解码。

它具有出色的压缩比和画质表现,广泛应用于视频流媒体、存储和传输等领域。

2. VP8/VP9编解码算法:ffmpeg也支持VP8/VP9视频编解码,它们是Google开发的开源视频编解码器。

VP8/VP9具有较低的专利费和较高的压缩比,广泛应用于在线视频流媒体和网络视频传输等领域。

3. 音频编解码算法:ffmpeg支持多种音频编解码算法,包括AAC、MP3、Opus等。

它可以根据不同的应用场景选择合适的编解码算法,提供高质量的音频处理效果。

三、编码流程1. 输入:将视频和音频文件作为输入,进行格式转换和处理。

2. 参数设置:根据需要设置编码参数,如分辨率、比特率、帧率等。

3. 编解码:使用相应的编解码算法对视频和音频数据进行编码处理。

4. 输出:将编码后的数据输出到文件或流媒体中。

四、常见问题及解决方法1. 编码过程中出现错误:检查编码参数是否设置正确,确保文件路径和文件名正确,以及文件是否存在等问题。

2. 编码速度慢:优化编码参数,选择合适的编解码算法和比特率,以及硬件配置和网络环境等因素。

3. 编码后文件大小过大:尝试降低比特率或使用压缩算法,但要注意画质和音频质量的影响。

4. 编码过程中出现音画不同步:检查音频和视频文件的帧率是否匹配,以及是否使用了正确的音频采样率等参数。

五、结论ffmpeg编码库算法提供了丰富的编解码功能和算法,支持多种视频和音频格式,广泛应用于视频和音频处理领域。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
已经编译好的ffmpeg库不用改,把这段代码写在一个c文件,加到调用ffmpeg的工程。
在调用完av_register_all()后调用register_rm_binary_codec,注册rm的解码器
不过有几点注意:
1、原代码中g_hInstance变量实际上是不需要的。GetModuleFileName的第一个参数可以为NULL
if (rvdec->frame.data[0])
avctx->release_buffer(avctx, &rvdec->frame);
if(avctx->get_buffer(avctx, &rvdec->frame) < 0){
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
#endif
#include "./libavcodec/avcodec.h"
#include <stdio.h>
#include <string.h>
#ifdef WIN32
typedef HRESULT (WINAPI *PRVCustomMessage)(void*, uint32_t);
代码也可以参考mplayer,它的代码还包含了Linux下解码的部分
http://svn.mplayerhq.hu/mplayer/trunk/libmpcodecs/vd_realvid.c?view=markup
/***************************************************************
void ResizeRow(uint8_t* pIn, uint32_t wi, uint32_t dpi, uint8_t* pOut, uint32_t wo, uint32_t dpo);
void Resize(uint8_t* pIn, uint32_t wi, uint32_t hi, uint8_t* pOut, uint32_t wo, uint32_t ho);
{
if(wi == wo) memcpy(pOut, pIn, wo);
else ResizeRow(pIn, wi, 1, pOut, wo, 1);
}
}
void ResizeHeight(uint8_t* pIn, uint32_t wi, uint32_t hi, uint8_t* pOut, uint32_t wo, uint32_t ho)
ResizeHeight(pOut + so, wo/2, hi/2, pIn + so, wo/2, ho/2);
ResizeHeight(pOut + so + so/4, wo/2, hi/2, pIn + so + so/4, wo/2, ho/2);
}
return -1;
}
以及RealVideoDecoderClose()函数中
if (rvdec->frame.data[0])
avctx->release_buffer(avctx, &rvdec->frame);
这两段代码是多余的,要删除。而且这样写会引起堆出错
if(wi == wo) return;
//ASSERT(0); // this is uncreachable code, but anyway... looks nice being so symmetric
ResizeWidth(pOut, wi, ho, pIn, wo, ho);
PRVFree RVFree;
PRVInit RVInit;
PRVTransform RVTransform;
#ifdef WIN32
HMODULE m_hDrvDll;
#else
void *m_hDrvDll;
#endif
uint32_t m_dwCookie;
让ffmpeg支持RMVB解码
参考的代码在
/viewthread.php?tid=2406
/index.php?title=%E9%99%A4%E4%BA%86%E7%94%A8avisynth%2C%E8%BF%98%E6%9C%89%E6%94%AF%E6%8C%81rmvb%E7%9A%84%E6%96%B9%E6%B3%95%E5%90%97%3F&oldid=325
else if(hi < ho)
{
ResizeHeight(pIn, wi, hi, pOut, wo, ho);
ResizeHeight(pIn + si, wi/2, hi/2, pOut + so, wo/2, ho/2);
ResizeHeight(pIn + si + si/4, wi/2, hi/2, pOut + so + so/4, wo/2, ho/2);
if(dpo == 1)
{
for( i = 0, j = 0, dj = (wi<<16)/wo; i < wo-1; i++, pOut++, j += dj)
uint8_t *m_pI420;
uint8_t *m_pI420Temp;
AVFrame frame;
}RealVideoDecContext;
//FIXME: redundant?
static uint32_t rm_swap(unsigned int x)
{
#else
typedef unsigned long (*PRVCustomMessage)(void*, uint32_t);
typedef unsigned long (*PRVFree)(uint32_t);
typedef unsigned long (*PRVInit)(void*, uint32_t* dwCookie);
* @file realvideocodec.c
* rmvideo decoder using the RealNetwork Binary DLLs
* பைடு நூலகம்
* Implementation of RealNetwork video interface wrapper for FFmpeg
* Created by [email=dev@]dev@[/email],2007/04/25--2007/05/02
}
void ResizeWidth(uint8_t* pIn, uint32_t wi, uint32_t hi, uint8_t* pOut, uint32_t wo, uint32_t ho)
{
uint32_t y;
for( y = 0; y < hi; y++, pIn += wi, pOut += wo)
ResizeWidth(pIn + si + si/4, wi/2, hi/2, pOut + so + so/4, wo/2, ho/2);
if(hi == ho) return;
ResizeHeight(pOut, wo, hi, pIn, wo, ho);
2、把GetModuleFileName改为GetModuleFileNameA,LoadLibrary改为LoadLibraryA,确保UNICODE版本的程序也可以正确运行。
3、RealVideoDecoderTransform()函数中
len = avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height);
void ResizeWidth(uint8_t* pIn, uint32_t wi, uint32_t hi, uint8_t* pOut, uint32_t wo, uint32_t ho);
typedef struct RealVideoDecContext
{
PRVCustomMessage RVCustomMessage;
typedef unsigned long (*PRVTransform)(uint8_t*, uint8_t*, void*, void*, uint32_t);
#endif
void ResizeHeight(uint8_t* pIn, uint32_t wi, uint32_t hi, uint8_t* pOut, uint32_t wo, uint32_t ho);
x = ((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF);
x = (x>>16) | (x<<16);
return x;
}
void Resize(uint8_t* pIn, uint32_t wi, uint32_t hi, uint8_t* pOut, uint32_t wo, uint32_t ho)
}
}
void ResizeRow(uint8_t* pIn, uint32_t wi, uint32_t dpi, uint8_t* pOut, uint32_t wo, uint32_t dpo)
{
//ASSERT(wi < wo);
相关文档
最新文档