我想修改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页眉和页脚部分时,文件变得相同并播放。
可能是什么问题?
答案 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();
你已经完成了。