修改GDCL MP4 Muxer(页眉/页脚不正确)

时间:2011-11-29 13:49:25

标签: directshow mp4

我想修改GDLC MP4 Muxer以便

  • 它不会将数据发送给其他编写器,但它只会记录它 本身就是一个文件数据......

  • 它将不再是一个复用器......它将是一个具有mp4复用器的作家......

但首先我必须弄清楚,最后[muxed]数据停留在哪里,以便我可以将其写入文件......

要获得可播放的文件,我必须将数据写入哪里?

我的尝试:

我输入了调试信息并看到它调用追加,此方法定期调用替换 ...我写缓冲区[BYTE pBuffer ]给出了MuxOutput的Append方法。我得到的二进制数据有一些标题但不能播放...所以它错了地方或我做错了.....然后我检查调用Append --- FillSpace方法和YUVVideoHandler :: WriteDescriptor ......但无法从其他方法获取有用的信息调用Append ...

更新

好吧,我能够以MuxOutput::Replace方法将数据写入文件...问题是标题信息和页脚(文件末尾的表)是错误的...其他数据[有效负载数据]是正确的...文件编写器录制的可播放文件以 00 00 00 18 ... [十六进制]开头但我的录制数据以 00 00 00 08 [十六进制] ....当我用文件编写器使用十六进制编辑器工具生成的文件替换mp4页眉和页脚部分时,文件变得相同并播放。

可能是什么问题?

2 个答案:

答案 0 :(得分:2)

在Mpeg4Mux :: Pause中,使用指向AtomWriter接口的指针创建MovieWriter(在我的例子中,通过调用下游文件写入器过滤器由输出引脚实现)。对文件的所有写入都是通过此接口进行的。首先写入数据,然后在停止时写入索引数据(moov chunk)并更新文件头和数据块头。

答案 1 :(得分:1)

我认为您的问题是由默认情况下Random File Access支持的File Writer Filter要求引起的。您需要遵循的步骤是:

1)在开头创建一个空文件

std::ofstream outFile;
outFile.open("c:\\out.mp4", ios_base::out | ios_base::binary);
outFile.close();

2)打开文件进行随机访问

outFile.open("c:\\out.mp4", ios_base::in | ios_base::out | ios_base::binary);

3)在输出引脚的Write()方法之后添加这些行(用适当的变量名替换position,buffer和bufferSize)

outFile.seekp(position);
outFile.write(buffer, bufferSize);

4)在录制会话结束时(像复用器的Close()方法那样)添加

outFile.close();

你已经完成了。