gpt4 book ai didi

ffmpeg - 我如何通过 libavformat 将 H264 流复用为 MP4 文件

转载 作者:行者123 更新时间:2023-12-02 03:06:11 32 4
gpt4 key购买 nike

我想实现一个应用程序,首先解码多媒体文件(例如test.mp4文件,视频编解码器id为H264),获取视频流和音频流,然后在音频流中进行一些不同,最后将视频流(使用libx264)和音频流编码成结果文件(result.mp4)。为了提高效率,我省略了视频流的解码和编码,我通过函数“av_read_frame”获取视频数据包,然后通过函数“av_write_frame”将其直接输出到结果文件中。但输出文件中没有图片,并且输出文件的大小相当小。

跟踪ffmpeg代码,发现在函数“av_write_frame->mov_write_packet->ff_mov_write_packet”中,会调用函数“ff_avc_parse_nal_units”来获取nal单元的大小,但是返回值很小(比如208)字节)。

我发现MP4文件中的H264码流不是以Annex-B格式存储的,所以找不到起始码(0x000001),现在我的问题是如何将H264码流改为Annex-B格式,并使其发挥作用?我手动在每一帧的开头添加了起始代码,但仍然不起作用。

任何人都可以给我任何提示吗?非常感谢。以下是与我类似的代码:

    // write the stream header, if any
av_write_header(pFormatCtxEnc);

.........
/**
* Init of Encoder and Decoder
*/

bool KeyFlag = false;
bool KeyFlagEx = false;
// Read frames and save frames to disk
int iPts = 1;
av_init_packet(&packet);
while(av_read_frame(pFormatCtxDec, &packet)>=0)
{
if (packet.flags == 1)
KeyFlag = true;

if (!KeyFlag)
continue;

if (m_bStop)
{
break;
}

// Is this a packet from the video stream?
if(packet.stream_index == videoStream)
{
currentframeNum ++;
if (progressCB != NULL && currentframeNum%20 == 0)
{
float fpercent = (float)currentframeNum/frameNum;
progressCB(fpercent,m_pUser);
}

if (currentframeNum >= beginFrame && currentframeNum <= endFrane)
{
if (packet.flags == 1)
KeyFlagEx = true;

if (!KeyFlagEx)
continue;
packet.dts = iPts ++;
av_write_frame(pFormatCtxEnc, &packet);

}
}
// Free the packet that was allocated by av_read_frame
}

// write the trailer, if any
av_write_trailer(pFormatCtxEnc);

/**
* Release of encoder and decoder
*/

return true;

最佳答案

您可以尝试这个:libavcodec/h264_mp4toannexb_bsf.c 。它将没有起始码的比特流转换为有起始码的比特流。

使用您的源文件,ffmpeg -i src.mp4 -vcodec copy -an dst.mp4 有效吗?如果添加 -bsf h264_mp4toannexb 是否有效? (当然,所有这些都使用与您尝试以编程方式使用相同版本/版本的 ffmpeg)

关于ffmpeg - 我如何通过 libavformat 将 H264 流复用为 MP4 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14052457/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com