- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 FFMpeg 中的 libavcodec 库来解码然后重新编码 h264 视频。
我有解码部分工作(很好地渲染到一个 SDL 窗口)但是当我尝试重新编码帧时,我在重新编码的视频样本中得到了错误的数据。
这是我的编码逻辑的精简代码片段。
EncodeResponse H264Codec::EncodeFrame(AVFrame* pFrame, StreamCodecContainer* pStreamCodecContainer, AVPacket* pPacket)
{
int result = 0;
result = avcodec_send_frame(pStreamCodecContainer->pEncodingCodecContext, pFrame);
if(result < 0)
{
return EncodeResponse::Fail;
}
while (result >= 0)
{
result = avcodec_receive_packet(pStreamCodecContainer->pEncodingCodecContext, pPacket);
// If the encoder needs more frames to create a packed then return and wait for
// method to be called again upon a new frame been present.
// Else check if we have failed to encode for some reason.
// Else a packet has successfully been returned, then write it to the file.
if (result == AVERROR(EAGAIN) || result == AVERROR_EOF)
{
// Higher level logic, dedcodes next frame from source
// video then calls this method again.
return EncodeResponse::SendNextFrame;
}
else if (result < 0)
{
return EncodeResponse::Fail;
}
else
{
// Prepare packet for muxing.
if (pStreamCodecContainer->codecType == AVMEDIA_TYPE_VIDEO)
{
av_packet_rescale_ts(m_pPacket, pStreamCodecContainer->pEncodingCodecContext->time_base,
m_pDecodingFormatContext->streams[pStreamCodecContainer->streamIndex]->time_base);
}
m_pPacket->stream_index = pStreamCodecContainer->streamIndex;
int result = av_interleaved_write_frame(m_pEncodingFormatContext, m_pPacket);
av_packet_unref(m_pPacket);
}
}
return EncodeResponse::EncoderEndOfFile;
}
if( h->frames.i_input <= h->frames.i_delay + 1 - h->i_thread_frames )
{
/* Nothing yet to encode, waiting for filling of buffers */
pic_out->i_type = X264_TYPE_AUTO;
return 0;
}
pStreamCodecContainer->pEncodingCodecContext->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
if (pStreamCodecContainer->codecType == AVMEDIA_TYPE_VIDEO)
{
pStreamCodecContainer->pEncodingCodecContext->height = pStreamCodecContainer->pDecodingCodecContext->height;
pStreamCodecContainer->pEncodingCodecContext->width = pStreamCodecContainer->pDecodingCodecContext->width;
pStreamCodecContainer->pEncodingCodecContext->sample_aspect_ratio = pStreamCodecContainer->pDecodingCodecContext->sample_aspect_ratio;
/* take first format from list of supported formats */
if (pStreamCodecContainer->pEncodingCodec->pix_fmts)
{
pStreamCodecContainer->pEncodingCodecContext->pix_fmt = pStreamCodecContainer->pEncodingCodec->pix_fmts[0];
}
else
{
pStreamCodecContainer->pEncodingCodecContext->pix_fmt = pStreamCodecContainer->pDecodingCodecContext->pix_fmt;
}
/* video time_base can be set to whatever is handy and supported by encoder */
pStreamCodecContainer->pEncodingCodecContext->time_base = av_inv_q(pStreamCodecContainer->pDecodingCodecContext->framerate);
pStreamCodecContainer->pEncodingCodecContext->sample_aspect_ratio = pStreamCodecContainer->pDecodingCodecContext->sample_aspect_ratio;
}
else
{
pStreamCodecContainer->pEncodingCodecContext->channel_layout = pStreamCodecContainer->pDecodingCodecContext->channel_layout;
pStreamCodecContainer->pEncodingCodecContext->channels =
av_get_channel_layout_nb_channels(pStreamCodecContainer->pEncodingCodecContext->channel_layout);
/* take first format from list of supported formats */
pStreamCodecContainer->pEncodingCodecContext->sample_fmt = pStreamCodecContainer->pEncodingCodec->sample_fmts[0];
pStreamCodecContainer->pEncodingCodecContext->time_base = AVRational{ 1, pStreamCodecContainer->pEncodingCodecContext->sample_rate };
}
pStreamCodecContainer->pEncodingCodecContext->time_base = m_pDecodingFormatContext->streams[pStreamCodecContainer->streamIndex]->time_base
pStreamCodecContainer->pEncodingCodecContext->time_base = av_inv_q(pStreamCodecContainer->pDecodingCodecContext->framerate);
最佳答案
为了修复损坏的 moov 框的初始问题,我必须添加 AV_CODEC_FLAG_GLOBAL_HEADER
在调用 avcodec_open2 之前标记到编码编解码器上下文。
encCodecContext->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
av_inv_q(framerate)
不同。正如 avcodec 转码示例中所建议的那样。
encCodecContext->time_base = decCodecFormatContext->streams[streamIndex]->time_base;
关于ffmpeg - FFMPEG libavcodec 解码然后重新编码视频问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53127434/
我需要在H.264容器中快速搜索MP4编码的视频流。我使用libav解码帧,因此偶然发现avformat_seek_file()方法。 我的问题是,假设H.264流以关键帧开头,而当我寻求时间戳0(无
我正在尝试解码用 H264 编码的视频。我将 AVPacket 的数据及其大小发送到解码器代码。我正在尝试解码帧并将其显示在 GUI 上。问题是当我解码帧时,它返回的帧字节数与数据包的大小相同,这意味
我想使用 libavcodec对于一个项目,问题是我不明白我应该从哪里获得官方版本,这个库非常受欢迎,我不知道官方网站是什么。 例如有 2 个主要项目,如 libav和 ffmpeg正在使用它,但我找
这是我使用 ffmpeg 的 libav* 解码音频流的过程 [videofile]--> (read audio packets) --> [pkts queue] --> (decoder) --
我有一个用 .3gp h.264 编码的视频,我希望在 C 中获得它的帧率和持续时间。这是我在打开后使用的代码文件并找到合适的编解码器: AVRational rational = gVideoCod
我正在通过 v4l 从相机中抓取视频帧,我需要将它们转码为 mpeg4 格式,以便通过 RTP 连续流式传输它们。 一切实际上都“有效”,但在重新编码时有些东西我没有:输入流产生 15fps,而输出为
我正在学习使用 libavcodec 进行编程。但我卡住了。我使用的所有教程都是视频文件,我需要一个音频文件。我正在使用 Ubuntu。 我应该如何从音频流中读取 AVCodecContext? 顺便
我正在使用 9.7 版的 libavcodec 编写一个简单的演示,几乎与 official example 中的示例完全相同。 . 但是,我无法打开编码器。另外,av_opt_set(context
我按照 Dranger 的教程使用 libav 和 FFMPEG 显示视频。 http://dranger.com/ffmpeg/ avcodec_decode_video2 似乎是视频解码过程中最慢
我正在尝试使用 ffmpeg 库制作一个最简单的应用程序。 这是我的代码: 主.c: #include #include #include int main() { avformat_n
什么AvPixelFormat我应该使用 *.png(PNG-24 和 PNG-8)图像吗? 我正在尝试使用 sws_scale 从 png 转换为 PIX_FMT_YUV420P 编辑,代码: av
我正在尝试使用 FFMpeg 中的 libavcodec 库来解码然后重新编码 h264 视频。 我有解码部分工作(很好地渲染到一个 SDL 窗口)但是当我尝试重新编码帧时,我在重新编码的视频样本中得
我有一个与 ffmpeg 库链接的 C++ 计算机视觉应用程序,该库提供从视频流到分析例程的帧。这个想法可以提供一个中等通用的视频流标识符,并且视频源将被解压缩并逐帧传递给分析例程(运行用户的分析功能
我想改变 gop 动态以适应玩家。较小的 gop 有助于降低首屏成本; Big gop 有助于降低比特率以节省带宽。 我发现nvenc有一个可以解决上述问题的功能。 https://docs.nvid
我想制作一个从 h.264 到 h.265 的转码视频应用程序。 我对 有疑问libavcodec 图书馆。我的项目中有这个库,所有功能都在工作,但是当我尝试设置编解码器时:avcodec_find_
当尝试获取 AVFrame 的时间戳时,有一个名为 best_effort_timestamp 的字段它描述为: frame timestamp estimated using various heu
除了调用 av_register_all(),是否有选择使用单个解码器的示例? 我想我将不得不调用 avcodec_register()、av_register_codec_parser() 等...
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 7年前关闭。 Improve th
我下载了一个软件( info-beamer ),我想使用 GPU 加速来解码 H.264 视频。我知道我的平台能够使用 GPU 解码 H.264 视频。我使用以下命令对 gstreamer 进行了一些
我正在 try catch 相机输出并使用 libavcodec 制作视频。作为如何完成此操作的示例,我使用了 ffmpeg muxing example . 问题是 4 秒视频的大小约为 15mb,
我是一名优秀的程序员,十分优秀!