Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何在保存录像的时候定时截图成JPEG格式? #50

Closed
dravvern opened this issue Jul 18, 2019 · 3 comments
Closed

如何在保存录像的时候定时截图成JPEG格式? #50

dravvern opened this issue Jul 18, 2019 · 3 comments

Comments

@dravvern
Copy link

保存录像mp4我知道如何操作, 就是想加个定时截图要怎么办?每天12点截个图,最好是jpg格式的。

@xia-chu
Copy link
Member

xia-chu commented Jul 19, 2019

你既然是要在mp4录制时截图,那么你可以在mp4录制相关的代码里面截图,
具体代码位置为 Mp4Maker.cpp第246行 :

void Mp4Maker::onTrackFrame(const Frame::Ptr &frame) {
	switch (frame->getCodecId()){
		case CodecH264:{
			inputH264(frame->data() + frame->prefixSize(), frame->size() - frame->prefixSize(),frame->stamp());
		}
			break;
		case CodecAAC:{
			inputAAC(frame->data() + frame->prefixSize(), frame->size() - frame->prefixSize(),frame->stamp());
		}
			break;

		default:
			break;
	}
}

你可以在输入H264时,提取I帧,然后解码保存截图:

//在Mp4Maker类中新增 List<Frame::Ptr> _frameCached 成员变量
void Mp4Maker::onTrackFrame(const Frame::Ptr &frame) {
	switch (frame->getCodecId()){
		case CodecH264:{
			//这里的代码逻辑是让SPS、PPS、IDR这些时间戳相同的帧打包到一起当做一个帧处理,
			if (!_frameCached.empty() && _frameCached.back()->dts() != frame->dts()) {
				Frame::Ptr back = _frameCached.back();
				Buffer::Ptr merged_frame = back;
				if(_frameCached.size() != 1){
					string merged;
					_frameCached.for_each([&](const Frame::Ptr &frame){
						merged.append(frame->data(),frame->size());
					});
					merged_frame = std::make_shared<BufferString>(std::move(merged));
				}
				//这里是合并sps pps idr帧的复合帧,可以用于解码成yuv,然后编码成jpeg保存截图
				// 数据指针:merged_frame->data(), 数据大小:merged_frame->size()
				_frameCached.clear();
			}
			_frameCached.emplace_back(frame);
			
			inputH264(frame->data() + frame->prefixSize(), frame->size() - frame->prefixSize(),frame->stamp());
		}
			break;
		case CodecAAC:{
			inputAAC(frame->data() + frame->prefixSize(), frame->size() - frame->prefixSize(),frame->stamp());
		}
			break;

		default:
			break;
	}
}

@dravvern
Copy link
Author

就是想知道 解码保存截图, 这个是怎么做的?

@xia-chu
Copy link
Member

xia-chu commented Jul 20, 2019

范例代码都帮你写好了 已经提取到sps、pps、idr帧,剩下的解码成yuv再编码成JPEG你自己不会吗?
不会的话,那你就没必要继续下一步的讨论了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants