【发布时间】:2019-08-25 14:48:13
【问题描述】:
我使用 ffmpeg 从 mp4 中的 h264 视频中转储代表单个帧的数据包
ffmpeg -i video.mp4 -c copy -vframes 1 -map 0:v:0 -f data frame.bin
frame.bin 中的数据似乎很好,并且似乎由与来自mdat 原子的第一个块/数据包(我不确定正确的术语是什么)完全相同的字节组成。
现在我想解码那个帧。由于我知道用于创建该数据包的编解码器 (h264),我想我可以简单地准备一个编解码器上下文,将所有数据加载到一个数据包中,然后使用传统的 avcodec_send_packet(codecContext, packet) 和 avcodec_receive_frame() 组合。
不幸的是,对avcodec_send_packetfails 的调用,我收到以下错误
(-1094995529) Invalid data found when processing input
由于数据包数据的前 4 个字节是数据包本身的大小,因此我尝试在将缓冲区传递给数据包之前跳过这些字节,但这也失败了。
我是跳过了某个步骤还是做错了什么?我想要做的甚至可能吗? (请说是 :)
【问题讨论】:
-
你必须阅读“AVCC”与“附件 B”。
-
你的意思是告诉 ffmpeg 读回它从原始文件中提取的同一个数据包是行不通的?
-
按照您的建议,我找到了stackoverflow.com/a/24890903/1593842,这似乎是一个非常好的解释,还告诉我 ffmpeg 给我的数据在 AVCC 上,但没有“标题”或“额外数据”或“序列阅读器”。所以我假设,没有它,ffmpeg 不知道如何解释数据流。我接近了吗?
-
它们是 H.264 NALUs 最常见的两种构图方式,AVCC 也将 SPS/PPS NALUs 置于“out-of-line”,在 FFmpeg 中这称为“extradata”。你大体上是正确的。
-
愿意将此作为答案发布以便我接受吗?你几乎给了我所有需要的信息。
标签: c ffmpeg h.264 libavcodec